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

时间:2014-04-18 15:05:03

标签: c# .net wcf async-await

我已经使用“允许生成异步操作”下的默认“生成基于任务的操作”选项向我的.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();

调用按预期返回。

我做错了什么?

1 个答案:

答案 0 :(得分:20)

我的chest hairs are tingling,T先生。我强烈怀疑你的(客户端)调用堆栈越来越强,你有一些调用Task<T>.ResultTask.Wait的代码,{ {3}}(正如我在博客中解释的那样)。

默认情况下,当您await Task时,await将捕获&#34;上下文&#34;并使用它来恢复async方法。如果这是像UI线程上下文的上下文,然后代码阻止 UI线程(即,调用ResultWait),那么async方法无法在该UI线程上恢复。

significantly increases the possibility of a deadlock会尝试混合同步和异步代码。只需使用pity the fool(正如我在MSDN文章中所述)。