Когда AggregateException может содержать более 1 внутреннего исключения? - PullRequest
8 голосов
/ 28 марта 2012

У меня есть вопрос относительно обработки ошибок .NET Task Parallel Library.В каких случаях AggregateException будет содержать более 1 внутреннего исключения?Я знаю, что это может произойти для бывших.при вызове Task.WaitAll(anArrayOfTasks) и 2 или более задач выдают исключение, но есть ли другие случаи (т. е. может ли случиться так, что, ожидая завершения только одной задачи, вы получите более 1 внутреннего исключения)?1003 *

Ответы [ 2 ]

5 голосов
/ 28 марта 2012

Это может произойти, если у вас есть «родительская» задача и одна или несколько «дочерних» задач, которые прикреплены к родительской. Это означает, что родительская задача будет завершена только после завершения всех ее дочерних задач, а исключения из дочерних задач также распространятся на родительскую задачу.

Взять, к примеру, следующий код:

var task = Task.Factory.StartNew(
    () =>
    {
        Task.Factory.StartNew(
            () => { throw new Exception("inner"); },
            TaskCreationOptions.AttachedToParent);

        throw new Exception("outer");
    });

Если вы Wait() выполняете это задание, это означает AggregateException, который выглядит следующим образом:

  • AggregateException
    • Exception: внешний
    • AggregateException
      • Exception: внутренний

Если вам не нравится, что он может содержать AggregateException s внутри AggregateException s, вы можете использовать Flatten() метод . Есть также еще один метод, который можно использовать для обработки AggregateException с: Handle().

5 голосов
/ 28 марта 2012

Задача может вызвать совокупное исключение, которое по своей сути может содержать несколько внутренних исключений. Это означает, что вы всегда должны учитывать совокупное исключение с несколькими внутренними исключениями при работе с задачами. Даже если вы не используете Task.WaitAll, задача, которую вы ждете, может внутренне ожидать нескольких подзадач. В качестве альтернативы, задача, которую вы ожидаете, может вернуть несколько исключений. Вы просто не можете знать, как звонящий.

...