いくつかのタスクを作成し、WaitAllでそれらを待機してから戻るメソッドがあります。問題は、これらのタスクがキャンセルされた場合、WaitAllが多数のTaskCanceledExceptionを含むAggregateExceptionをスローすることです。
これは、WaitAllが2つの異なる状況で例外をスローすることを意味します。
- 真のエラーを示す例外。これらは、処理方法がわからない状態があったことを意味します。最終的にプロセスを終了するまで、未処理の例外として伝播する必要があります。
- ユーザーが[キャンセル]ボタンをクリックしたことを示す例外。これは、タスクがキャンセルされてクリーンアップされ、プログラムが正常に実行され続けることを意味します。
後者は、厄介な例外の定義に正直に当てはまります。これは、完全に例外ではない状況でスローされる例外であるため、通常の制御フローを再開するには、それをキャッチする必要があります。幸いなことに、捕まえるのは簡単ですよね?追加catch (AggregateException)
して-ああ、待ってください。これは、致命的なエラーが発生したときにスローされるのと同じタイプです。
タスクが実行を終了するのを待ってから戻る必要があるので(データベース接続やファイルハンドルなどを使用していないことを知る必要があります)、WaitAllなどが必要です。また、いずれかのタスクに障害が発生した場合、それらの例外を未処理の例外として伝播させたいと思います。キャンセルの例外は必要ありません。
WaitAll
キャンセルされたタスクの例外がスローされないようにするにはどうすればよいですか?