在运行下面的测试方法时,我发现即使我等待一个抛出异常的任务,测试也会通过。此外,还会弹出一个单独的窗口,提示“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
时立即完成,之前 抛出异常。
关于c# - 使用异步方法等待 Task.Run 不会在正确的线程上抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34167849/