Mr.*_*. T 4 .net c# wcf async-await
我已经使用"允许生成异步操作"下的默认"生成基于任务的操作"选项向我的.NET 4.5应用程序添加了WCF服务引用.我从我自己的异步方法调用服务,有点像这样:
public async Task<SomeData> GetDataAsync()
{
var client = new MyServiceClient();
var result = await client.GetSomeDataAsync();
return result;
}
Run Code Online (Sandbox Code Playgroud)
将await client.GetSomeDataAsync()永远不会完成(在return语句断点从未被击中),我没有得到一个超时或任何其他错误,没有任何异常被抛出,什么都没有.Fiddler显示客户端发送了请求,服务几乎立即响应了预期的数据,所以问题就在我身边.
如果我切换到同步版本
var result = client.GetSomeData();
Run Code Online (Sandbox Code Playgroud)
该调用按预期返回.
我究竟做错了什么?
Ste*_*ary 20
我的胸毛被刺痛,T先生我强烈怀疑,进一步您(客户端)调用堆栈,你有一些代码正在调用Task<T>.Result或Task.Wait,这显著增加了死锁的可能性(我解释我的博客) .
默认情况下,当您执行awaita时Task,await将捕获"上下文"并使用它来恢复该async方法.如果这是像UI线程上下文这样的上下文,然后代码阻塞 UI线程(即,调用Result或Wait),则该async方法无法在该UI线程上恢复.
我怜悯那些试图混合同步和异步代码的傻瓜.只要使用async所有的方式(如我的MSDN文章中介绍).
| 归档时间: |
|
| 查看次数: |
8990 次 |
| 最近记录: |