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