gpt4 book ai didi

c# - 在 HttpClient 中使用 await 进行异步调用永远不会返回

转载 作者:IT王子 更新时间:2023-10-29 03:37:33 25 4
gpt4 key购买 nike

我在 Win8 CP 上的一个基于 xaml 的 C# metro 应用程序中有一个调用;此调用只是点击网络服务并返回 JSON 数据。

HttpMessageHandler handler = new HttpClientHandler();

HttpClient httpClient = new HttpClient(handler);
httpClient.BaseAddress = new Uri("http://192.168.1.101/api/");

var result = await httpClient.GetStreamAsync("weeklyplan");
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(WeeklyPlanData[]));
return (WeeklyPlanData[])ser.ReadObject(result);

它卡在 awaithttp 调用实际上几乎立即返回(通过 fiddler 确认);就好像 await 被忽略了,它只是卡在那里。

在您询问之前 - 是 - 专用网络功能已打开。

知道为什么会挂起吗?

最佳答案

查看 this answer我的问题似乎非常相似。

可以尝试的方法:对 GetStreamAsync() 返回的任务调用 ConfigureAwait(false)。例如

var result = await httpClient.GetStreamAsync("weeklyplan")
.ConfigureAwait(continueOnCapturedContext:false);

这是否有用取决于上面代码的调用方式 - 在我的例子中使用 Task.GetAwaiter().GetResult() 调用 async 方法导致代码挂起。

这是因为 GetResult() 会阻塞当前线程,直到任务完成。当任务确实完成时,它会尝试重新进入启动它的线程上下文,但不能,因为该上下文中已经有一个线程,该线程被调用 GetResult() 阻塞。 .僵局!

This MSDN post详细介绍了 .NET 如何同步并行线程 - 和 the answer given to my own question给出了一些最佳实践。

关于c# - 在 HttpClient 中使用 await 进行异步调用永远不会返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9895048/

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