C# InnerException in AggregateException

本文关键字:AggregateException in InnerException | 更新日期: 2023-09-27 17:56:53

我有如下代码来捕获使用 TaskFactory 和 Task.Run 创建的任务引发的异常。如果我使用 TaskFactory,则可以在"继续"任务中检查上一个任务引发的异常,而无需使用 Task.WaitAll 方法。如果我使用 Task.Run,除非我显式等待子任务完成,否则"继续"任务将不会执行。TaskFactory.StartNew 中的哪个标志改变了此行为?

另外,在AggregateException类中,InnerException和InnerException有什么区别?InnerExceptions 向我返回子任务抛出的所有异常的只读集合。InnerException 返回仅由一个子任务引发的异常的聚合执行。

//Use Factory
TaskCreationOptions atp = TaskCreationOptions.AttachedToParent;
Task.Factory.StartNew(() =>
{
    Task.Factory.StartNew (() => { throw null; }, atp);
    Task.Factory.StartNew (() => { throw new NullReferenceException();}, atp);
    Task.Factory.StartNew (() => { throw new Exception("Test"); }, atp);
})
.ContinueWith (p => p.Exception.Dump(),TaskContinuationOptions.OnlyOnFaulted);
//Use Task.Run
Task.Run(()=>
{
    TaskCreationOptions op = TaskCreationOptions.AttachedToParent;
    var t1 = Task.Factory.StartNew(()=> {throw null;}, op);
    var t2 = Task.Factory.StartNew(()=> {throw new NullReferenceException();}, op);
    var t3 = Task.Factory.StartNew(()=> {throw new Exception("Test");}, op);
    //This will trigger the continued task
    //Task.WaitAll(new Task[]{t1,t2,t3}); 
}).ContinueWith(task => {task.Exception.Dump();}, TaskContinuationOptions.OnlyOnFaulted);

C# InnerException in AggregateException

  • InnerExceptionException 的属性,返回"导致此异常的异常"。
  • InnerExceptionsAggregateException独有的属性。 由于其设计,聚合异常可以包含多个"引起"异常。

由于属性InnerException是继承的,因此它从 InnerExceptions 返回第一个异常是有意义的。

为了回答您的另一个问题,即示例代码的行为,区别在于Task.Run的默认值TaskCreationOptions。 默认值为 TaskCreationOptions.DenyChildAttach 。 您可以在这篇博文中阅读更多相关信息。

相关文章:
  • 没有找到相关文章