4

MSDN@のTPL例外処理の例を見ています。

http://msdn.microsoft.com/en-us/library/dd537614(v=VS.100).aspx

コードの基本的な形式は次のとおりです。

Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); });
try
{
   task1.Wait();
}
catch (AggregateException ae)
{
   throw ae.Flatten();
}

私の質問は:これは競合状態ですか?tryが実行される前にtask1がスローされた場合はどうなりますか?これがレースになるのを止める何かが欠けていますか?

代わりに次のように書くべきではありません:

try
{
   Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); });
   task1.Wait();
}
catch (AggregateException ae)
{
   throw ae.Flatten();
}
4

1 に答える 1

6

いいえ、最初の例は完全に有効です。

タスクで例外が発生すると、AggregateExceptionにラップされます。別のスレッドがタスクに参加する場合にのみ、この例ではtask1.Wait()を呼び出して、参加しているスレッドに伝播される例外です。基本的に、例外は、フィードバックを待機しているスレッドに伝播できるようになるまで「保存」されます。

于 2010-04-16T20:29:10.880 に答える