当运行下面的测试方法时,我发现即使我等待抛出异常的任务,测试也会通过.此外,弹出一个单独的窗口,说"QTAgent.exe已停止工作".这表示异常未传播到运行测试的线程,而是杀死单独的线程.
我想知道为什么会这样.此外,由于这似乎没有按预期工作,我应该如何在线程池线程上运行异步方法?
请注意,如果我更改它,以便如果func不是异步,则会按预期在测试线程中抛出异常.
[TestMethod] public async Task TestWeirdTaskBehavior() { Action func = async () => { await Task.Delay(0); throw new InvalidOperationException(); }; await Task.Run(func); }
Kirill Shlen.. 8
简单的调整:
[TestMethod] public async Task TestWeirdTaskBehavior() { Funcfunc = async () => { await Task.Delay(0); throw new InvalidOperationException(); }; await Task.Run(func); }
你Action
本质上是一个async void
.Task
如果要等待它或将其包装在另一个中,您需要编译器为您吐出一个Task
.在原始代码段中,外部任务(Task.Run(...)
)在内部任务命中第一个任务之前完成await
,然后抛出异常.
简单的调整:
[TestMethod] public async Task TestWeirdTaskBehavior() { Funcfunc = async () => { await Task.Delay(0); throw new InvalidOperationException(); }; await Task.Run(func); }
你Action
本质上是一个async void
.Task
如果要等待它或将其包装在另一个中,您需要编译器为您吐出一个Task
.在原始代码段中,外部任务(Task.Run(...)
)在内部任务命中第一个任务之前完成await
,然后抛出异常.