转载自MGEN
和for/foreach中发生异常的表现一样,Parallel循环中的任何异常都会使整个循环终止,注意由于整个循环是分块同时进行的,因此整个循环不会立即终止(如果有一个线程正在进行长时间工作的话,而且是发生在CancellationToken的ThrowIfCancellationRequested方法之后)。
代码:
try
{
Parallel.For(0, 5, (i) =>
{
throw new Exception("异常。迭代数字:" + i);
});
}
catch (AggregateException ae)
{
foreach (var exp in ae.InnerExceptions)
Console.WriteLine(exp.Message);
}
将会输出0-4的子集(也有可能是0-4全部输出,由于5个线程都快速运行完成)。
与Parallel.For和ForEach不一样,Parallel.Invoke总是会把所有任务都执行完,然后把所有的异常包装在AggregateException中。
来看这段代码:
try
{
Parallel.Invoke(() => { throw new Exception("1"); },
() => { Thread.Sleep(1500); throw new Exception("2"); },
() => { Thread.Sleep(3000); throw new Exception("3"); });
}
catch (Aggregate