0

タスクで発生した例外を処理するための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()は呼び出し元のスレッドではなく、別のスレッドでも実行されます。

4

1 に答える 1

3

呼び出し task1.Wait(); task1 が完了するまで、呼び出し元のスレッドがブロックされますよね? もしそうなら、タスクを使用する理由がまったくわかりません。タスクを使用してコードが同期的に呼び出されるか非同期的に呼び出されるかに関係なく、コードの実行が終了するか例外がスローされるまで、呼び出し元のスレッドがブロックされるためです。

右。ただし、メソッドを呼び出す前に、呼び出し元のスレッドで必要なこと (たとえば、他のタスクの開始や操作の実行) を行うことができますWait()

また、呼び出し元のコードが try-catch ブロックに入る前に task1 が例外をスローするとどうなるでしょうか? それが可能な場合、try-catch ブロックは AggregateException をキャッチしません。

例外はキャッチされ、内部に保存されます。次に、Wait()タスク インスタンスでメソッドを呼び出すと、元の例外がラップさAggregateExceptionれ、呼び出し元のスレッドに伝達されます。

于 2013-01-23T21:34:03.147 に答える