首页 >后端开发 >C++ >Async Void 和 Async Task 方法在处理 ASP.NET 中的未完成操作方面有何不同?

Async Void 和 Async Task 方法在处理 ASP.NET 中的未完成操作方面有何不同?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-04 01:43:41864浏览

How Do Async Void and Async Task Methods Differ in Handling Outstanding Operations in ASP.NET?

ASP.Net 中 Async Void 和异步任务中的未完成操作计数

在 ASP.Net 应用程序中,async void 方法不同于处理未完成操作的异步任务方法。这种区别可能会导致 async void 出现以下异常,但 async Task 不会出现异常:

System.InvalidOperationException: An asynchronous module or handler completed while an asynchronous operation was still pending

了解 Async Void

Async void 会在以下情况下增加未完成操作的计数:调用并在完成时递减它。这意味着它不会真正导致“即发即忘”行为,因为 ASP.Net 会跟踪其完成情况。

异步任务为何有效?

何时返回任务时,未完成操作的计数不会增加。相反,框架异步等待返回的任务完成。这种方法消除了出现上述异常的可能性。

示例

public class HomeController : AsyncController
{
    // Will work fine (no exception)
    public async Task<ActionResult> ThisPageWillLoad()
    {
        // Fire and forget task
        this.FireAndForgetTask();

        return await Task.FromResult(this.View("Index"));
    }

    private async Task FireAndForgetTask()
    {
        var task = Task.Delay(TimeSpan.FromSeconds(3));
        await task;
    }

    // Will result in an exception due to async void
    public async Task<ActionResult> ThisPageWillNotLoad()
    {
        this.FireAndForgetVoid();

        return await Task.FromResult(this.View("Index"));
    }

    private async void FireAndForgetVoid()
    {
        var task = Task.Delay(TimeSpan.FromSeconds(3));
        await task;
    }
}

历史背景

Microsoft 优先顺序向后将异步引入 ASP.Net 时的兼容性和“一个 ASP.NET”。他们保留了对 EAP 组件的支持,但增强了核心 ASP.Net SynchronizationContext,以检测并排除某些情况下 async void 的任何不当使用。在 MVC/WebAPI/SignalR 世界中,框架自然而然地采用了 async Task,消除了 async void 的需要。

结论

在现代 ASP.Net 应用程序中,通常是建议避免 async void 并返回 Task。这种方法可确保正确跟踪未完成的操作并消除上述异常的可能性。

以上是Async Void 和 Async Task 方法在处理 ASP.NET 中的未完成操作方面有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

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