Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#异步任务返回不工作_C#_.net_Asynchronous - Fatal编程技术网

C#异步任务返回不工作

C#异步任务返回不工作,c#,.net,asynchronous,C#,.net,Asynchronous,我正在使用HttpClient处理一个异步http调用。该调用是在异步任务中进行的。调用成功,我从Http调用中得到响应。但是,当我尝试从任务返回响应时,什么也没有发生,即使返回后有一个断点等待 public void ExecuteTask(Foundation.Security.SecurityToken token, Order order) { ExecuteTaskAsync(token, order).Wait(); } public async Task ExecuteT

我正在使用HttpClient处理一个异步http调用。该调用是在异步任务中进行的。调用成功,我从Http调用中得到响应。但是,当我尝试从任务返回响应时,什么也没有发生,即使返回后有一个断点等待

public void ExecuteTask(Foundation.Security.SecurityToken token, Order order)
{
    ExecuteTaskAsync(token, order).Wait();
}

public async Task ExecuteTaskAsync(Foundation.Security.SecurityToken token, Order order)
{
    if (order != null)
    {
        log.Info("Starting export of order " + order.ID.ToString());
        bool success = await ExportOrder(order, token);
        if (!success)
        {
            log.Error("Failed to export order with ID " + order.ID.ToString());
        }
    }
}

private async Task<bool> ExportOrder(Order order, Foundation.Security.SecurityToken token)
{
    try
    {
        ResponseObject response = await webService.SendOrder(new SenderInformation(token), new ReceiverInformation(order, token));
        if (response.Success && response.Status.Equals("201", StringComparison.OrdinalIgnoreCase))
        {
            log.Info(String.Format("Order ({0}) was successfully exported"), order.ExternalOrderID);
           return true;
    }
        return false;
    }
    catch (Exception e)
    {
        log.Error(String.Format("Exception occured while exporting order ({0})", order.ID), e);
        return false;
    }
}
public void ExecuteTask(Foundation.Security.SecurityToken令牌,订单)
{
ExecuteTaskAsync(令牌,顺序).Wait();
}
公共异步任务ExecuteTaskAsync(Foundation.Security.SecurityToken令牌,订单)
{
如果(订单!=null)
{
log.Info(“开始导出订单”+order.ID.ToString());
bool success=等待出口订单(订单、令牌);
如果(!成功)
{
log.Error(“无法导出ID为“+order.ID.ToString()”的订单);
}
}
}
专用异步任务出口订单(订单、基础、安全、安全令牌令牌)
{
尝试
{
ResponseObject response=wait webService.SendOrder(新的发送者信息(令牌)、新的接收者信息(订单、令牌));
if(response.Success&&response.Status.Equals(“201”,StringComparison.OrdinalIgnoreCase))
{
log.Info(String.Format(“订单({0})已成功导出”)、Order.ExternalOrderID;
返回true;
}
返回false;
}
捕获(例外e)
{
log.Error(String.Format(“导出订单({0})时发生异常)”,order.ID),e);
返回false;
}
}
下面是执行实际http调用的代码。我用注释“代码成功地到达了这一行。在这之后什么也没有发生”标记了最后一个功能行

公共任务发送顺序(发送方信息发送方、接收方信息接收方)
{
OrderRequest=新的OrderRequest(发送方、接收方);
返回ExecuteRequest(请求);
}
专用异步任务ExecuteRequest(RequestType请求)
其中RequestType:RequestObject
其中ResponseType:class,ResponseObject,new()
{
尝试
{
使用(var client=new HttpClient())
{
字符串xml=序列化请求(请求);
HttpContent=新的StringContent(xml);
content.Headers.ContentType=new System.Net.Http.Headers.MediaTypeHeaderValue(“text/xml”);
string requestUrl=“URL”;
HttpResponseMessage response=await client.PostAsync(请求URL,内容).ConfigureAwait(错误);
//解析响应
if(响应。IsSuccessStatusCode)
{
Stream responseStream=wait response.Content.ReadAsStreamAsync();
ResponseType responseObject=反序列化响应(responseStream);
if(responseObject!=null)
{
responseObject.Success=true;
return responseObject;//代码成功到达此行。在此之后,不会发生任何事情
}
其他的
{
log.Error(“无法反序列化响应”);
}
}
其他的
{
log.Error(“请求期间出错,获取状态代码”+响应.StatusCode);
}
}
}
捕获(例外e)
{
log.Error(“出错了!”,e);
}
返回新的ResponseType(){Success=false};
}

问题出在这一行:

ExecuteTaskAsync(token, order).Wait();
这会导致死锁:被调用方法中的
wait
s无法恢复,因为UI线程被阻塞


当你使用异步代码时,你必须一直使用它;永远不要同步等待异步任务完成。

您没有显示调用
SendOrder
的方法-这很可能是您的问题所在。Async需要始终保持异步-如果链中有任何方法返回非任务的内容,则链将断开。是的,考虑到已到达
ExecuteRequest
中的return语句,而不是
wait SendOrder
之后的下一条语句,这可能是一个死锁。这类死锁通常是由于使用
Task.Result
Task.Wait
或阻止当前线程的任何类似构造造成的。在第一个代码块中添加更多代码以显示整个方法在调用开始时添加了整个方法链。顶部的方法是第一个名为
ExecuteTaskAsync(token,order).Wait()的方法,这基本上是一个
任务。Wait()
,它将阻止当前线程,因此无法执行其余线程(在
Wait
之后),实际上是死锁。我会说“当前线程”,在这种情况下不一定是“UI”线程,但是的,这也是我在评论中说的:-)@Jcl,通常,只有UI线程具有同步上下文,因此问题只发生在该线程上。没错,我通常将“UI”与“GUI”混淆,因此我不喜欢在Web服务上称其为“UI线程”。。。但是,是的,你确实是对的,如果我删除Wait(),我会得到一个InvalidOperationException,它说:“异步操作此时不能启动。异步操作只能在异步处理程序或模块内启动,或者在页面生命周期的某些事件期间启动。”@Mattias,啊,不知道它是ASP.NET应用程序。但问题依然存在;您没有UI线程,但有一个同步上下文。无论如何,我并不是建议你根本不要等待任务;我建议您
wait
it,这意味着您必须将
ExecuteTask
更改为异步。
ExecuteTaskAsync(token, order).Wait();