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();
}

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

不应该这样写吗:

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

1 回答 1

6

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

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

于 2010-04-16T20:29:10.880 回答