如何阻止 HttpClient.GetAsync(uri) 挂起? [复制]

Posted

技术标签:

【中文标题】如何阻止 HttpClient.GetAsync(uri) 挂起? [复制]【英文标题】:How to stop HttpClient.GetAsync(uri) from hanging? [duplicate] 【发布时间】:2014-03-26 02:57:52 【问题描述】:

我有以下用于调用 uri 的代码:

var uri = string.Format("Helpers/ProfileList/Online/?locationId=0&skip=0&take=0", numProfiles);
HttpResponseMessage response = await client.GetAsync(uri);
response.EnsureSuccessStatusCode();

uri 指向一个自定义的 web api uri(我可以调试和跟进)。但是,当调用 api 中的最后一个 return 语句时,似乎什么也没发生。它应该转到response.EnsureSuccessStatusCode(); 行,但不是。它似乎挂了。

【问题讨论】:

【参考方案1】:

我的 spidey-sense 告诉我,在调用堆栈的更深处,您的代码阻塞了返回的任务,例如,Task.WaitTask<T>.Result。默认情况下,这将是 cause a deadlock 我在我的博客上解释的。

要修复它,请将 Task.WaitTask<T>.Result 替换为 await

【讨论】:

我只是建议尝试await client.GetAsync(uri).ConfigureAwait(false),这可能会消除这样的死锁:) 是的,我在写完问题后发现了这个问题(在右侧的“相关”列中) ConfigureAwait 更像是一种变通方法而不是解决方案,IMO;你最终会得到更脆弱的代码。更合适的解决方案是使用await 而不是WaitResult

以上是关于如何阻止 HttpClient.GetAsync(uri) 挂起? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# (.NET 4.5) 中为 HttpClient.GetAsync(URI) 创建回调?

如何确定一个404响应状态使用时,httpclient.getasync

连接到 *** 时 HttpClient.GetAsync 超时

HttpClient.GetAsync,无效的 URI 异常

HttpClient.GetAsync 一次只执行 2 个请求?

在 Azure Function 上获取数据时,HttpClient.GetAsync() 会产生 AggregateException