ASP.NET MVC コントローラーでの Fire-and-Forget 非同期操作の管理
DeleteFooAsync
などの非同期「fire-and-forget」メソッドは、非同期プログラミングで頻繁に発生します。従来のアドバイスは、これらのシナリオでは async
/await
を避けることですが、同期の相手が利用できない場合、これは現実的ではない可能性があります。
TaskScheduler.UnobservedTaskException
を使用して監視されていない例外を単純に処理することは、同期コンテキストの問題が発生する可能性があるため、信頼性が低くなります。
以下に示すように、非同期メソッドを try-catch ブロック内にラップすると例外に対処できますが、メソッドが多数ある場合は面倒になります。
<code class="language-csharp">private async void DeleteFooWrapperAsync() { try { await DeleteFooAsync(); } catch (Exception exception) { m_log.Error("DeleteFooAsync failed: " + exception.ToString()); } }</code>
ASP.NET MVC コントローラー内のファイア アンド フォーゲット呼び出しに対する最も堅牢なソリューションは、Task.Run
:
<code class="language-csharp">Task foo = Task.Run(() => DeleteFooAsync());</code>
これにより、非同期操作が別のスレッドにオフロードされ、応答のブロックが防止され、信頼性の高い実行が保証されます。
以上がASP.NET MVC で Fire-and-Forget 非同期メソッドを適切に処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。