具有的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();

调用按预期返回。

我做错了什么?

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

我的胸毛都刺痛了,T先生。我强烈怀疑,在您(客户端)的调用堆栈中,有一些代码正在调用Task<T>.ResultTask.Wait,这大大增加了死锁的可能性(正如我在博客上解释的那样)。

默认情况下,当awaitTask时,await将捕获一个"上下文",并使用它来恢复async方法。如果这是一个类似于UI线程上下文的上下文,然后代码阻塞UI线程(即调用ResultWait),则async方法无法在该UI线程上恢复。

我很同情那些试图混合使用同步和异步代码的傻瓜。只要一直使用async(正如我在MSDN文章中所描述的)。