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

C# MSDN处理TPL异常的示例-这是竞争条件吗?,c#,race-condition,task-parallel-library,C#,Race Condition,Task Parallel Library,我正在看MSDN@TPL异常处理示例 守则的基本形式是: Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); }); try { task1.Wait(); } catch (AggregateException ae) { throw ae.Flatten(); } 我的问题是:这是比赛条件吗?如果task1在try执行之前抛出,会发生什么情况?我是否错过了阻止这

我正在看MSDN@TPL异常处理示例

守则的基本形式是:

Task task1 = Task.Factory.StartNew(() => { throw new IndexOutOfRangeException(); });
try
{
   task1.Wait();
}
catch (AggregateException ae)
{
   throw ae.Flatten();
}
我的问题是:这是比赛条件吗?如果task1在try执行之前抛出,会发生什么情况?我是否错过了阻止这场比赛的东西

不应该这样写吗

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

不,第一个例子完全正确

当在任务中引发异常时,它被包装在AggregateException中。只有当另一个线程加入任务时,在本例中通过调用task1.Wait()将异常传播到加入线程。从本质上讲,异常是“存储”的,直到它可以传播回等待反馈的线程