我有如下代码来捕获使用TaskFactory和Task.Run创建的任务中的异常抛出。如果我使用TaskFactory,我可以检查从继续任务中的前一个任务引发的异常,而不必使用Task.WaitAll方法。如果使用Task.Run,则除非显式等待子任务完成,否则将不会执行继续执行的任务。TaskFactory.StartNew中的哪个标志改变了这种行为?
另外,InnerException和InnerExceptions在AggregateException类中有什么区别?InnerExceptions返回子任务引发的所有异常的只读集合。InnerException只返回一个子任务引发的异常的AggregateExcpetion。
//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);发布于 2015-06-18 14:45:29
InnerException是Exception的一个属性,返回“导致这一例外的例外”。InnerExceptions是AggregateException特有的属性。由于它的设计,聚合异常可以包含多个“导致”异常。由于属性InnerException是继承的,因此从InnerExceptions返回第一个异常是有意义的。
要回答另一个问题,即示例代码的行为,区别是TaskCreationOptions默认为Task.Run。默认情况是TaskCreationOptions.DenyChildAttach。您可以在这篇博客文章中阅读更多有关这方面的内容。
https://stackoverflow.com/questions/30918524
复制相似问题