首页 > 后端开发 > C++ > 为什么我的httpclient.getAsync在使用ASP.NET中使用/异步时挂起悬挂?

为什么我的httpclient.getAsync在使用ASP.NET中使用/异步时挂起悬挂?

DDD
发布: 2025-01-25 13:23:08
原创
766 人浏览过

Why Does My HttpClient.GetAsync Call Hang When Using Await/Async in ASP.NET?

ASP.NET 中使用 Await/Async 时 HttpClient.GetAsync(...) 挂起的原因

在 ASP.NET 中,只有一个线程可以同时处理一个请求。虽然可以进行并行处理,但只有一个线程拥有请求上下文。此线程管理由 ASP.NET SynchronizationContext 控制。

当等待一个 Task 时,方法通常会在捕获的 SynchronizationContext(如果不存在则为 TaskScheduler)上恢复。这与异步控制器操作的预期行为一致。

测试用例 5 中的问题

Test5Controller.Get 中的死锁是由于以下顺序造成的:

  1. 在 ASP.NET 请求上下文中调用 HttpClient.GetAsync。
  2. HttpClient.GetAsync 发送 HTTP 请求并返回一个未完成的 Task。
  3. AsyncAwait_GetSomeDataAsync 等待 Task 并返回一个未完成的 Task,因为请求仍在进行中。
  4. Test5Controller.Get 阻塞当前线程,直到 AsyncAwait_GetSomeDataAsync 返回的 Task 完成。
  5. 接收到 HTTP 响应,HttpClient.GetAsync Task 完成。
  6. AsyncAwait_GetSomeDataAsync 尝试在 ASP.NET 请求上下文中恢复。
  7. 发生死锁,因为在 Test5Controller.Get 中阻塞的线程仍然持有请求上下文。

解决问题

可以实施一些最佳实践来避免类似的问题:

  • 在库异步方法中使用 ConfigureAwait(false) 来在 ASP.NET 请求上下文之外调度延续。
  • 通过使用 await 而不是 GetResult 或 Task.Wait 来避免阻塞 Task。

结论

了解 SynchronizationContext 的作用以及使用 async/await 技术的最佳实践,可以确保在 ASP.NET 中使用异步代码时高效且无死锁的操作。

以上是为什么我的httpclient.getAsync在使用ASP.NET中使用/异步时挂起悬挂?的详细内容。更多信息请关注PHP中文网其他相关文章!

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