Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AggregateException中的C#InnerException_C#_Aggregateexception - Fatal编程技术网

AggregateException中的C#InnerException

AggregateException中的C#InnerException,c#,aggregateexception,C#,Aggregateexception,我使用下面的代码捕获使用TaskFactory和Task.Run创建的任务引发的异常。如果我使用TaskFactory,我就能够检查继续任务中前一个任务引发的异常,而不必使用task.WaitAll方法。如果我使用Task.Run,除非我显式地等待子任务完成,否则将不会执行继续的任务。TaskFactory.StartNew中的哪个标志更改了此行为 另外,AggregateException类中的InnerException和InnerException之间有什么区别?InnerExceptio

我使用下面的代码捕获使用TaskFactory和Task.Run创建的任务引发的异常。如果我使用TaskFactory,我就能够检查继续任务中前一个任务引发的异常,而不必使用task.WaitAll方法。如果我使用Task.Run,除非我显式地等待子任务完成,否则将不会执行继续的任务。TaskFactory.StartNew中的哪个标志更改了此行为

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

//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);
  • InnerException
    是带有返回的
    Exception
    的属性
  • innerException
    aggregateeException
    的唯一属性。由于其设计,聚合异常可以包含多个“导致”异常
由于继承了属性
InnerException
,因此它可以从
InnerExceptions
返回第一个异常


要回答关于示例代码行为的其他问题,区别在于
TaskCreationOptions
默认值为
Task.Run
。默认值为
TaskCreationOptions.denychildatach
。您可以在中了解更多信息。

我们什么时候应该使用InnerException,因为它不能全面说明问题的起因?如果您知道它是一个
聚合异常,我想您不应该使用它。
InnerException
仅用于维护
Exception
的合同。是的,非常感谢。当我使用Task.rung时,需要更仔细地考虑。通常,你是这样认为的。你说过“它返回第一个异常是有意义的”,但你永远不应该假设代码会做“有意义的”事情。。。你能保证是这样吗?