为什么unawaited异步方法不会抛出异常?

时间:2014-06-26 23:25:38

标签: c# .net asynchronous error-handling async-await

我认为异步方法应该像普通方法一样,直到它们到达等待。

为什么这不会引发异常?

有没有办法在没有等待的情况下抛出异常?

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 个答案:

答案 0 :(得分:16)

根据设计,async方法中抛出的异常存储在返回的任务中。要获得例外,您可以:

  1. await任务:await t.Helper();
  2. Wait任务:t.Helper().Wait();
  3. 在任务完成后检查任务的Exception属性var task = t.Helper(); Log(task.Exception);
  4. 为处理异常的任务添加续集:t.Helper().ContinueWith(t => Log(t.Exception), TaskContinuationOptions.OnlyOnFaulted);
  5. 你最好的选择是第一个。只需await任务并处理异常(除非有特定原因,您无法执行此操作)。更多Task Exception Handling in .NET 4.5