首頁 > 後端開發 > C++ > Async Void 和 Async Task 方法在處理 ASP.NET 中的未完成操作上有何不同?

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

Mary-Kate Olsen
發布: 2025-01-04 01:43:41
原創
844 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板