当运行下面的测试方法时,我发现即使我等待抛出异常的任务,测试也会通过。此外,弹出一个单独的窗口说" QTAgent.exe已停止工作"。这表示异常未传播到运行测试的线程,而是杀死单独的线程。
我想知道为什么会这样。此外,由于这看起来没有按预期工作,我应该如何在线程池线程上运行异步方法?
请注意,如果我更改它,以便如果func不是异步,则会按预期在测试线程中抛出异常。
[TestMethod]
public async Task TestWeirdTaskBehavior()
{
Action func = async () =>
{
await Task.Delay(0);
throw new InvalidOperationException();
};
await Task.Run(func);
}
答案 0 :(得分:7)
简单调整:
[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
之前完成,在引发异常之前完成。