等待任务.使用异步方法运行不会在正确的线程上引发异常

本文关键字:线程 异常 任务 异步方法 运行 等待 | 更新日期: 2023-09-27 18:26:16

运行下面的测试方法时,我发现即使我等待抛出异常的任务,测试也会通过。此外,会弹出一个单独的窗口,上面写着"QTAgent.exe已停止工作"。这表示异常不会传播到运行测试的线程,而是终止单独的线程。

我想知道为什么会这样。此外,由于这似乎没有按预期工作,我应该如何在线程池线程上运行异步方法?

请注意,如果我更改它,以便如果 func 不是异步的,则异常会按预期在测试线程中抛出。

 [TestMethod]
 public async Task TestWeirdTaskBehavior()
 {
      Action func = async () =>
      {
           await Task.Delay(0);
           throw new InvalidOperationException();
      };
      await Task.Run(func);
 }

等待任务.使用异步方法运行不会在正确的线程上引发异常

简单的调整:

[TestMethod]
public async Task TestWeirdTaskBehavior()
{
    Func<Task> func = async () =>
    {
        await Task.Delay(0);
        throw new InvalidOperationException();
    };
    await Task.Run(func);
}

您的Action本质上是async void.如果您想等待它或将其包装在另一个Task中,您需要编译器为您吐出Task。在原始代码段中,外部任务(Task.Run(...)(在内部任务到达第一个await时立即完成,然后抛出异常。