我已经使用“允许生成异步操作”下的默认“生成基于任务的操作”选项向我的.NET 4.5应用程序添加了WCF服务引用。我是从我自己的异步方法调用服务,有点像这样:
public async Task<SomeData> GetDataAsync()
{
var client = new MyServiceClient();
var result = await client.GetSomeDataAsync();
return result;
}
await client.GetSomeDataAsync()
永远不会完成(返回语句中的断点永远不会被命中)并且我没有得到超时或任何其他错误,没有抛出异常,没有。 Fiddler显示客户端发送了请求,服务几乎立即响应了预期的数据,所以问题出现在我身边的某个方面。
如果我切换到同步版本
var result = client.GetSomeData();
调用按预期返回。
我做错了什么?
答案 0 :(得分:20)
我的chest hairs are tingling,T先生。我强烈怀疑你的(客户端)调用堆栈越来越强,你有一些调用Task<T>.Result
或Task.Wait
的代码,{ {3}}(正如我在博客中解释的那样)。
默认情况下,当您await
Task
时,await
将捕获&#34;上下文&#34;并使用它来恢复async
方法。如果这是像UI线程上下文的上下文,然后代码阻止 UI线程(即,调用Result
或Wait
),那么async
方法无法在该UI线程上恢复。
我significantly increases the possibility of a deadlock会尝试混合同步和异步代码。只需使用pity the fool(正如我在MSDN文章中所述)。