首页 >后端开发 >C++ >为什么在 ASP.NET 中使用 `async void` 通常会导致'异步模块或处理程序已完成,而异步操作仍处于挂起状态”?

为什么在 ASP.NET 中使用 `async void` 通常会导致'异步模块或处理程序已完成,而异步操作仍处于挂起状态”?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-04 20:10:401031浏览

Why Does Using `async void` in ASP.NET Often Result in

Async Void 和 ASP.Net:了解异常

在 ASP.Net 应用程序中使用 async void 方法时,可能会遇到异常声明:“异步模块或处理程序已完成,而异步操作仍处于挂起状态。”出现此异常的原因是 async void 在调用时增加未完成操作的计数,并在完成时减少它。

相反,async Task 方法返回一个 Task 对象,允许 ASP.Net 框架跟踪异步操作并处理优雅地完成。

为什么任务有帮助

通过返回任务,您可以启用框架来:

  • 监视操作的进度并确保它在结束请求之前完成。
  • 处理操作期间可能出现的任何异常并将其传播给调用者。
  • 管理同步上下文并确保异步操作在适当的位置上运行

异步 Void 和即发即弃

虽然 async void 方法可能看起来实现了即发即弃方法,但这是不准确的在 ASP.Net 上下文中。框架主动跟踪这些方法,如果它们过早完成,则会引发异常。

要实现真正的即发即弃行为,请使用异步任务方法并忽略返回的任务。然而,由于潜在的问题,通常不鼓励从 ASP.Net 中的请求过早返回。

附加说明

  • Microsoft 设计了 ​​ASP.Net 的异步支持以保留向后兼容性,解释了 async void 在某些情况下的使用。
  • WebForms 利用 async void 事件处理程序,而 MVC/WebAPI/SignalR 依赖于 async Task。
  • 不支持混合 async Task 和 async void,因为它可能会导致所描述的异常。

以上是为什么在 ASP.NET 中使用 `async void` 通常会导致'异步模块或处理程序已完成,而异步操作仍处于挂起状态”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn