Вопрос

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, когда бросает исключение в задачу, оно обернуто в совокупность.
Но то же самое не происходит при использовании Ждите ключевое слово.
Каково объяснение такого поведения?

Это было полезно?

Решение

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

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

Другие советы

В тпл 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

Вот хорошее объяснение в деталях, Стивен Туб, почему существует разница в типе исключения между задачей. Wation () и ожидает:

Обработка исключений задачи в .NET 4.5

При проектировании задачи. Весна в .net 4, мы выбирали всегда распространять заряд. Это решение повлияло на необходимость не перезаписать детали, но также и основным вариантом использования задач в то время, в том числе вилка/присоединение параллелизма, где потенциал для множества исключений довольно распространен.

Хотя аналогично Task.Wait на высоком уровне (то есть прогресс вперед не достигнут до завершения задачи), «await task» представляет собой совершенно другой основной набор сценариев. Вместо того, чтобы использоваться для вилки/присоединения параллелизма, наиболее распространенным использованием «Await Task» является принятие последовательного, синхронного фрагмента кода и превращения его в последовательный, асинхронный кусок кода. В местах в вашем коде, где вы выполняете синхронную операцию, вы заменяете ее на асинхронную операцию, представленную задачей, и «ждите» ее. Таким образом, в то время как вы, безусловно, можете использовать ожидание операций VOIK/JOIN (например, используя задачу. Whehanall), это не 80% случаев. Кроме того, .NET 4.5 видит введение System.Runtime.Exceptionsersers.ExceptionDispatchInfo, которая решает проблему, позволяя вам использовать исключения маршала в разных темах, не теряя детали исключения, такие как стек трассировки и ведра Уотсона. Учитывая объект исключения, вы передаете его ExcectionDispatchInfo.create, который возвращает объект ExceptionDispatchInfo, который содержит ссылку на объект исключения и копию его деталей. Когда пришло время бросить исключение, метод броска ExceptionDispatchInfo используется для восстановления содержимого исключения и бросить его без потери исходной информации (информация о текущей стеке вызовов добавляется к тому, что уже хранится в исключении).

Учитывая это, и снова выбирая всегда бросить первое или всегда бросить в совокупность, для «ожидания» мы предпочитаем всегда бросить первое. Это не значит, однако, что у вас нет доступа к одинаковым деталям. Во всех случаях свойство исключения задачи по -прежнему возвращает совокупную экспрессию, которая содержит все исключения, поэтому вы можете поймать, что бросается, и вернуться, чтобы проконсультироваться с задачей. Исключение при необходимости. Да, это приводит к несоответствию между поведением исключений при переключении между «task.wait ()» и «задачей ожидания», но мы рассматривали это как значительное меньшее из двух зло.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top