我对.NET任务并行库的错误处理有疑问。在哪种情况下AggregateException
会有超过1个内部异常?我知道这可能发生在前。在调用Task.WaitAll(anArrayOfTasks)
时,有2个或更多任务正在抛出异常,但是还有其他任何情况(也就是说,如果只等待1个任务完成,那么你可以获得超过1个内部异常) ?
答案 0 :(得分:5)
任务可以引发聚合异常,该异常本身可以包含多个内部异常。这意味着在处理任务时,应始终考虑具有多个内部异常的聚合异常。即使您没有使用Task.WaitAll,您正在等待的任务可能在内部等待多个子任务。或者,您等待的任务可能会返回多个异常。你根本无法作为来电者知道。
答案 1 :(得分:5)
如果您有“父”任务以及附加到父级的一个或多个“子”任务,则会发生这种情况。这意味着父任务只有在所有子任务完成且子任务的异常也传播到父任务时才会完成。
例如,使用以下代码:
var task = Task.Factory.StartNew(
() =>
{
Task.Factory.StartNew(
() => { throw new Exception("inner"); },
TaskCreationOptions.AttachedToParent);
throw new Exception("outer");
});
如果您Wait()
执行该任务,则会显示AggregateException
,如下所示:
AggregateException
Exception
:outer AggregateException
Exception
:inner 如果您不喜欢它,AggregateException
内可以包含AggregateException
,则可以使用the Flatten()
method。还有另一种方法可用于处理AggregateException
s:Handle()
。