我有如下代码来捕获使用 TaskFactory 和 Task.Run 创建的任务引发的异常。如果我使用 TaskFactory,我可以在 Continued 任务中检查上一个任务引发的异常,而无需使用 Task.WaitAll 方法。如果我使用 Task.Run,除非我明确地等待子任务完成,否则不会执行 Continued 任务。TaskFactory.StartNew 中的哪个标志改变了这种行为?
另外,AggregateException 类中的 InnerException 和 InnerExceptions 有什么区别?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);