タスクで発生した例外を処理するためのMSDNのパターンは、コードを同期しているように見えます。これがMSDNページのコードです:
var task1 = Task.Factory.StartNew(() =>
{
throw new MyCustomException("I'm bad, but not too bad!");
});
try
{
task1.Wait();
}
catch (AggregateException ae)
{
// Code removed
}
この呼び出しtask1.Wait();
により、task1が完了するまで呼び出し元のスレッドがブロックされます。その場合、タスクを使用する理由はまったくわかりません。コードがタスクを使用して同期的に呼び出されるか非同期的に呼び出されるかに関係なく、コードの実行が終了するか例外がスローされるまで、呼び出し元のスレッドはブロックされます。
また、呼び出し元のコードがtry-catchブロックに入る前に、task1が例外をスローした場合はどうなりますか?それが可能な場合、try-catchブロックはAggregateExceptionをキャッチしません。
タスクで発生した例外を呼び出し元のスレッドに通知するにはどうすればよいですか?task1.Wait();
例外の通知を受けるために電話する必要はないと思います。私は知ってContinueWith()
いますが、のコードContinueWith()
は呼び出し元のスレッドではなく、別のスレッドでも実行されます。