нормальное поведение для исключений, исходящих из методов async Task, заключается в том, чтобы оставаться бездействующим до тех пор, пока они не будут обнаружены позже или до тех пор, пока задача не получит сбор мусора.
Я могу придумать случаи, когда я могу немедленно бросить. Вот пример:
public static async Task TestExAsync(string filename)
{
    // the file is missing, but it may be there again
    // when the exception gets observed 5 seconds later,
    // hard to debug
    if (!System.IO.File.Exists(filename))
        throw new System.IO.FileNotFoundException(filename);
    await Task.Delay(1000);
}
public static void Main()
{
    var task = TestExAsync("filename");
    try
    {
        Thread.Sleep(5000); // do other work
        task.Wait(); // wait and observe
    }
    catch (AggregateException ex)
    {
        Console.WriteLine(new { ex.InnerException.Message, task.IsCanceled });
    }
    Console.ReadLine();
}
Я мог бы использовать async void, чтобы обойти это, которое сразу бросается:
// disable the "use await" warning
#pragma warning disable 1998
public static async void ThrowNow(Exception ex)
{
    throw ex;
}
#pragma warning restore 1998
public static async Task TestExAsync(string filename)
{
    if (!System.IO.File.Exists(filename))
        ThrowNow(new System.IO.FileNotFoundException(filename));
    await Task.Delay(1000);
}
Теперь я могу обработать это исключение прямо на месте с помощью Dispatcher.UnhandledException или AppDomain.CurrentDomain.UnhandledException, по крайней мере, сразу же принести его вниманию пользователя.
Есть ли другие варианты для этого сценария? Возможно, это надуманная проблема?
