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)
不,第一个例子是完全有效的.
当在Task中引发异常时,它将被包装在AggregateException中.仅当另一个线程加入任务时,在此示例中,通过调用task1.Wait()是传递给加入线程的异常.本质上,异常是"存储"的,直到它可以被传播回等待反馈的线程.