首页 > 后端开发 > C++ > 为什么在 ASP.NET 中使用 `await`/`async` 时 `HttpClient.GetAsync(...)` 挂起?

为什么在 ASP.NET 中使用 `await`/`async` 时 `HttpClient.GetAsync(...)` 挂起?

Mary-Kate Olsen
发布: 2025-01-25 13:28:10
原创
282 人浏览过

Why Does `HttpClient.GetAsync(...)` Hang When Using `await`/`async` in ASP.NET?

asp.net

/asyncawait僵局:解决方案HttpClient.GetAsync(...)> 在ASP.NET

中使用

>使用HttpClient.GetAsync(...)方法可以导致死锁。之所以发生这种情况,是因为ASP.NET的单线程请求处理模型与async的异步性质发生冲突。 当HttpClient暂停执行时,该线程将释放,但是恢复任务可能会尝试重新重新考虑已被另一个请求占用的同一线程,从而导致停滞。> await

理解僵局:

返回不完整的
  1. httpClient.GetAsync>Task悬挂当前线程直到
  2. 完成。
  3. > await>尝试在ASP.NET请求上下文中恢复,但是上下文已经在使用中。 Task僵局结果。
  4. Task
  5. 密钥解决方案:

此至关重要的方法可防止
    的延续被安排回原始上下文(例如,ASP.NET请求线程)。这消除了与上下文相关的僵局的潜力。
  1. ConfigureAwait(false)>避免阻塞:Task始终使用

    ,而不是
  2. 之类的方法,哪个>
  3. 上同步阻塞,直接导致死锁。 await GetResult()代码示例:Task

有问题的代码:

>校正的代码:

<code class="language-csharp">public async Task<string> GetSomeDataAsync()
{
    var httpClient = new HttpClient();
    var result = await httpClient.GetAsync("http://stackoverflow.com", HttpCompletionOption.ResponseHeadersRead);
    return result.Content.Headers.ToString();
}</code>
登录后复制
进一步读取:

>更深入地了解.NET中的异步编程以及如何避免僵局,请参阅以下资源:>

以上是为什么在 ASP.NET 中使用 `await`/`async` 时 `HttpClient.GetAsync(...)` 挂起?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板