首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# InnerException in AggregateException

C# InnerException in AggregateException
EN

Stack Overflow用户
提问于 2015-06-18 14:41:55
回答 1查看 8.6K关注 0票数 7

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

另外,InnerException和InnerExceptions在AggregateException类中有什么区别?InnerExceptions返回子任务引发的所有异常的只读集合。InnerException只返回一个子任务引发的异常的AggregateExcpetion。

代码语言:javascript
复制
//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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-18 14:45:29

  • InnerExceptionException的一个属性,返回“导致这一例外的例外”
  • InnerExceptionsAggregateException特有的属性。由于它的设计,聚合异常可以包含多个“导致”异常。

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

要回答另一个问题,即示例代码的行为,区别是TaskCreationOptions默认为Task.Run。默认情况是TaskCreationOptions.DenyChildAttach。您可以在这篇博客文章中阅读更多有关这方面的内容。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30918524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档