グローバル非同期タスク例外処理メカニズムの調査
.NET 4.5 での非同期プログラミングの導入により、重要な疑問が浮上しました: アプリケーションは、非同期 Task メソッドでスローされた例外をキャッチするグローバル例外ハンドラーを定義できますか?
非同期タスクにおける例外伝播メカニズム
非同期 Task メソッドで発生する例外は、タスクの完了を処理するコードによって監視される必要があります。タスクが監視されない場合、例外は休止状態になります。
コードスニペットの例:
<code>string x = await DoSomethingAsync();</code>
DoSomethingAsync が例外をスローした場合、コードを try-catch ブロックに配置するなど、await 式を処理するときにのみ観察されます。例外を観察できないと、例外が処理されず、無視される可能性があります。
AppDomain と監視されていないタスクの例外
.NET 4.5 は、監視されていない例外を処理するための 2 つのイベントを提供します。
UnhandledException イベントは通常、同期コードで監視されていない例外を処理するために使用されます。ただし、非同期タスクの例外は通常、タスクがガベージ コレクションを試行したときに UnobservedTaskException イベントによって処理されます。
非同期タスクの UnhandledException を有効にする
デフォルトでは、.NET 4.5 は、監視されていない非同期タスク例外に対して UnhandledException イベントを起動しません。この動作は、アプリケーション構成ファイルで ThrowUnobservedTaskExceptions プロパティを true に設定することで変更できます。
非同期 void メソッド
非同期 void メソッドの場合、例外処理の動作は異なります。観察すべきタスク参照がないため、例外は現在の同期コンテキストで直ちにスローされます。 WPF では、これにより Dispatcher.UnhandledException を含む一連のイベントが発生し、アプリケーションがクラッシュする可能性があります。この場合、タスクがないため、TaskScheduler.UnobservedTaskException はトリガーされません。
概要
同期の監視されていない例外に対してグローバル例外ハンドラーを定義することは可能ですが、非同期 Task メソッドでスローされる例外の動作はより微妙です。これらの例外がどのように伝播するかを理解し、例外が監視されずにアプリケーションの予期しない動作が引き起こされるのを防ぐために、例外を適切に処理することが重要です。
以上が.NET 4.5 アプリケーションは、非同期タスク例外のグローバル例外ハンドラーを定義できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。