ASP.NET MVC での Fire-and-Forget 非同期メソッドの安全な実装: 未処理の例外の処理
この記事では、ASP.NET MVC で非同期メソッドの「ファイア アンド フォーゲット」パターンを実装する際に発生する可能性のあるリスクとベスト プラクティスについて、監視されない例外の処理方法に焦点を当てて説明します。これはよくある質問です。
同期メソッドは Task.Run
または TaskFactory.StartNew
を使用して別のスレッドで実行するようにラップできますが、非同期メソッドには特有の課題があります。適切なエラー処理を行わずに非同期メソッドを直接呼び出すと、監視されない例外が発生する可能性があるため、この問題に対処するにはより包括的なアプローチが必要になります。
1 つの解決策は、次のようなカスタム ラッパー メソッドを使用することです。
<code class="language-csharp">private async void DeleteFooWrapperAsync() { try { await DeleteFooAsync(); } catch(Exception exception) { m_log.Error("DeleteFooAsync failed: " + exception.ToString()); } }</code>
このメソッドは TaskFactory.StartNew
内で呼び出すことができ、例外を処理するより安全な方法を提供します。ただし、これには、実行される非同期メソッドごとにカスタム ラッパー コードを記述する必要があります。
もう 1 つのオプション (Stephen Cleary が提案) は、BackgroundTaskManager
コンポーネントを使用することです。このアプローチにより、同期作業と非同期作業の両方を登録し、TaskScheduler.UnobservedTaskException
経由で例外を処理できます:
<code class="language-csharp">BackgroundTaskManager.Run(() => DeleteFooAsync());</code>
「fire-and-forget」は注意して使用する必要があることに注意することが重要です。 DeleteFooAsync
の結果が重要な場合は、タスクが完了するまで待つことをお勧めします。ただし、そのようなパターンが実際に必要な場合、これらのソリューションは、監視されていない例外を処理し、潜在的なシステム障害を防ぐ効率的な方法を提供します。
以上がASP.NET MVC で Fire-and-Forget 非同期メソッドを安全に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。