ASP.NET MVC 非同期メソッドでファイア アンド フォーゲットを安全に処理する
「ファイア アンド フォーゲット」アプローチは通常、ASP.NET アプリケーションでは推奨されませんが、完了を待たずに非同期メソッドを呼び出す必要がある状況もあります。ただし、ファイア アンド フォーゲット方式での非同期メソッドの実行には、一定のリスクと制限が伴います。
リスクの 1 つは、非同期メソッド内の未処理の例外が気づかれず、予期しない動作を引き起こす可能性があることです。この問題を解決するには、TaskScheduler.UnobservedTaskException
イベントをサブスクライブして例外をログに記録し、例外によってアプリケーションがクラッシュするのを防ぐことをお勧めします。
もう 1 つのオプションは、次のように非同期メソッドで例外を処理するラッパー メソッドを作成することです。
<code class="language-csharp">private async Task DeleteFooWrapperAsync() { try { await DeleteFooAsync(); } catch(Exception exception ) { m_log.Error("DeleteFooAsync failed: " + exception.ToString()); } }</code>
ただし、各非同期メソッドを try-catch ブロックでラップすると、冗長で反復的になる可能性があることに注意してください。
もう 1 つのアプローチは、ASP.NET ランタイムを使用して非同期作業を登録することです。 Scott Hanselman の BackgroundTaskManager
ライブラリを使用すると、タスクを同時に実行し、例外を一元的にログに記録できます:
<code class="language-csharp">BackgroundTaskManager.Run(() => DeleteFooAsync());</code>
このメソッドはタスクをランタイムに登録し、ASP.NET リクエストの完了後も例外をキャッチしながら実行を継続できるようにします。
最後に、例外処理を行わずにファイアアンドフォーゲット方式で非同期メソッドを実行する必要がある場合は、Task.Run()
を使用して非同期操作用の新しいスレッドを作成できます。
<code class="language-csharp">Task foo = Task.Run( () => DeleteFooAsync() );</code>
ただし、ファイアアンドフォーゲットは、ハンドルされない例外の潜在的な結果を許容できる場合にのみ使用する必要があることに留意することが重要です。
以上がASP.NET MVC で「ファイア アンド フォーゲット」非同期メソッドを安全に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。