ASP.Net の Async Void および Async Task の未処理の操作の数
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 に非同期を導入する場合の互換性と「1 つの ASP.NET」。 EAP コンポーネントのサポートは維持されましたが、コア ASP.Net SynchronizationContext が強化され、特定のシナリオでの async void の不適切な使用を検出して除外できるようになりました。 MVC/WebAPI/SignalR の世界では、フレームワークは自然に async Task を採用し、async void の必要性を排除しました。
結論
現代の ASP.Net アプリケーションでは、一般に、 async void を避け、代わりに Task を返すことをお勧めします。このアプローチにより、未処理の操作が適切に追跡され、前述の例外が発生する可能性が排除されます。
以上がASP.NET での未処理の操作の処理において、Async Void メソッドと Async Task メソッドはどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。