MSDN处理TPL中的异常的示例 - 这是竞争条件吗?

Dav*_*vid 4 c# race-condition task-parallel-library

我正在查看来自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();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:这是竞争条件吗?如果task1在try执行之前抛出会发生什么?我错过了阻止这场比赛的东西吗?

不应该这样写:

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

Chr*_*lor 6

不,第一个例子是完全有效的.

当在Task中引发异常时,它将被包装在AggregateException中.仅当另一个线程加入任务时,在此示例中,通过调用task1.Wait()是传递给加入线程的异常.本质上,异常是"存储"的,直到它可以被传播回等待反馈的线程.