具有的WCF服务客户端.NET 4.5基于任务的异步操作,等待永远不会返回
本文关键字:异步操作 等待 任务 永远 返回 于任务 客户端 服务 WCF NET | 更新日期: 2023-09-27 17:59:05
我添加了一个WCF服务引用到我的。NET 4.5应用程序,使用"允许生成异步操作"下的默认"生成基于任务的操作"选项
public async Task<SomeData> GetDataAsync()
{
var client = new MyServiceClient();
var result = await client.GetSomeDataAsync();
return result;
}
await client.GetSomeDataAsync()
永远不会完成(return语句上的断点永远不会被命中),我也不会得到超时或任何其他错误,也不会引发异常,什么都没有。Fiddler显示,客户端发送了请求,服务几乎立即响应了预期的数据,所以不知何故,问题就在我这边。
如果我切换到同步版本而不是
var result = client.GetSomeData();
调用按预期返回。
我做错了什么?
我的胸毛都刺痛了,T先生。我强烈怀疑,在您(客户端)的调用堆栈中,有一些代码正在调用Task<T>.Result
或Task.Wait
,这大大增加了死锁的可能性(正如我在博客上解释的那样)。
默认情况下,当await
是Task
时,await
将捕获一个"上下文",并使用它来恢复async
方法。如果这是一个类似于UI线程上下文的上下文,然后代码阻塞UI线程(即调用Result
或Wait
),则async
方法无法在该UI线程上恢复。
我很同情那些试图混合使用同步和异步代码的傻瓜。只要一直使用async
(正如我在MSDN文章中所描述的)。