gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:57:17 26 4
gpt4 key购买 nike

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

调用按预期返回。

我做错了什么?

最佳答案

我的 chest hairs are tingling ,T 先生。我强烈怀疑在您的(客户端)调用堆栈的更上方,您有一些代码正在调用 Task<T>.ResultTask.Wait ,这significantly increases the possibility of a deadlock (正如我在我的博客上解释的那样)。

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

pity the fool谁会尝试混契约(Contract)步和异步代码。只需使用 async all the way (如我在 MSDN 文章中所述)。

关于c# - 具有 .NET 4.5 基于任务的异步操作的 WCF 服务客户端,等待永远不会返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23156825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com