我试图理解为什么 ASP.Net 应用程序中的 async void 方法会导致以下异常,而 async Task 似乎不会:
System.InvalidOperationException: An asynchronous module or handler
completed while an asynchronous operation was still pending
我对 .NET 中的异步世界还比较陌生,但我确实觉得我已经尝试通过许多现有资源来运行这个,包括以下所有资源:
从这些资源中,我了解到最佳实践通常是返回 Task 并避免异步无效。我也明白 async void 在调用方法时会增加未完成操作的计数,并在完成时减少它。这听起来至少是我问题的部分答案。但是,我缺少的是当我返回 Task 时会发生什么,以及为什么这样做会使事情“工作”。
这是一个人为的例子来进一步说明我的问题:
public class HomeController : AsyncController
{
// This method will work fine
public async Task<ActionResult> ThisPageWillLoad()
{
// Do not await the task since it is meant to be fire and forget
var task = this.FireAndForgetTask();
return await Task.FromResult(this.View("Index"));
}
private async Task FireAndForgetTask()
{
var task = Task.Delay(TimeSpan.FromSeconds(3));
await task;
}
// This method will throw the following exception:
// System.InvalidOperationException: An asynchronous module or
// handler completed while an asynchronous operation was still pending
public async Task<ActionResult> ThisPageWillNotLoad()
{
// Obviously can't await a void method
this.FireAndForgetVoid();
return await Task.FromResult(this.View("Index"));
}
private async void FireAndForgetVoid()
{
var task = Task.Delay(TimeSpan.FromSeconds(3));
await task;
}
}
在相关说明中,如果我对 async void 的理解是正确的,那么在这种情况下将 async void 视为“即发即弃”是不是有点错误,因为 ASP.Net 实际上并没有忘记它?