Бросить исключение внутри задачи - "ожидание" против ожидания () - PullRequest
19 голосов
/ 08 сентября 2011
static async void Main(string[] args)
{
    Task t = new Task(() => { throw new Exception(); });

    try
    {                
        t.Start();
        t.Wait();                
    }
    catch (AggregateException e)
    {
        // When waiting on the task, an AggregateException is thrown.
    }

    try
    {                
        t.Start();
        await t;
    }
    catch (Exception e)
    {
        // When awating on the task, the exception itself is thrown.  
        // in this case a regular Exception.
    }           
}

В TPL, при возникновении исключения внутри Задачи оно оборачивается исключением AggregateException.
Но этого не происходит при использовании ключевого слова await .
Чем объясняется такое поведение?

Ответы [ 2 ]

9 голосов
/ 08 сентября 2011

Цель состоит в том, чтобы заставить его выглядеть / вести себя как синхронная версия.Джон Скит делает большую работу, объясняя это в своей серии Eduasync, особенно в этом посте:

http://codeblog.jonskeet.uk/2011/06/22/eduasync-part-11-more-sophisticated-but-lossy-exception-handling/

2 голосов
/ 23 марта 2017

В TPL AggregateException используется потому, что в операции ожидания может быть несколько задач (к задаче могут быть прикреплены дочерние задачи), поэтому многие из них могут генерировать исключения. Посмотрите на Исключения в дочерних задачах раздел

https://msdn.microsoft.com/ru-ru/library/dd997417(v=vs.110).aspx

В await у вас всегда есть только одна задача

См. Также https://msdn.microsoft.com/ru-ru/library/dd997415(v=vs.110).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...