何时AggregateException包含多个内部异常?

scr*_*pni 8 .net exception task-parallel-library

我有一个关于.NET任务并行库的错误处理的问题.在哪种情况下会AggregateException持有超过1个内部异常?我知道这可能发生在前.在调用时Task.WaitAll(anArrayOfTasks),2个或更多任务正在抛出异常,但是还有其他情况(即,如果只等待1个任务完成,你会得到超过1个内部例外)吗?

Pol*_*ity 5

任务可以引发聚合异常,该异常本身可以包含多个内部异常.这意味着在处理任务时,应始终考虑具有多个内部异常的聚合异常.即使您没有使用Task.WaitAll,您正在等待的任务可能在内部等待多个子任务.或者,您等待的任务可能会返回多个异常.你根本无法像呼叫者那样知道.


svi*_*ick 5

如果您有"父"任务和一个或多个附加到父级的"子"任务,则会发生这种情况.这意味着父任务只有在其所有子任务完成且子任务的异常也传播到父任务时才会完成.

例如,以下代码:

var task = Task.Factory.StartNew(
    () =>
    {
        Task.Factory.StartNew(
            () => { throw new Exception("inner"); },
            TaskCreationOptions.AttachedToParent);

        throw new Exception("outer");
    });
Run Code Online (Sandbox Code Playgroud)

如果您Wait()执行该任务,则会产生如下任务AggregateException:

  • AggregateException
    • Exception:外面的
    • AggregateException
      • Exception:内心

如果你不喜欢它可以包含AggregateExceptions里面的AggregateExceptions,你可以使用Flatten()方法.还有另一种方法可用于处理AggregateExceptions : Handle().