使用.NET 4.5基于任务的异步操作的WCF服务客户端,等待永远不会返回

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>.ResultTask.Wait,这显著增加了死锁的可能性(我解释我的博客) .

默认情况下,当您执行awaita时Task,await将捕获"上下文"并使用它来恢复该async方法.如果这是像UI线程上下文这样的上下文,然后代码阻塞 UI线程(即,调用ResultWait),则该async方法无法在该UI线程上恢复.

怜悯那些试图混合同步和异步代码的傻瓜.只要使用async所有的方式(如我的MSDN文章中介绍).

  • 几乎不得不为你所有的T先生参考投票.;-) (2认同)