Почему невосстановленные асинхронные методы не генерируют исключения?

Я думал, что методы асинхронного поведения должны были вести себя как обычные методы, пока они не достигли ожидания.

Почему это не вызывает исключение?

Есть ли способ, чтобы исключение было отправлено без ожидания?

using System;
using System.Threading.Tasks;

public class Test
{
    public static void Main()
    {
        var t = new Test();
        t.Helper();
    }

    public async Task Helper()
    {
        throw new Exception();
    }
}

Ответ 1

Исключение, созданное внутри метода async, по своему усмотрению хранится внутри возвращенной задачи. Чтобы избавиться от исключения, вы можете:

  • await задача: await t.Helper();
  • Wait задача: t.Helper().Wait();
  • Проверить задачу Exception свойство после. Задача завершена: var task = t.Helper(); Log(task.Exception);
  • Добавьте продолжение к этой задаче, которая обрабатывает исключение: t.Helper().ContinueWith(t => Log(t.Exception), TaskContinuationOptions.OnlyOnFaulted);

Ваш лучший вариант - первый. Просто await выполните задачу и обработайте исключение (если нет конкретной причины, вы не можете этого сделать). Подробнее в Обработка исключений задач в .NET 4.5