当前位置:  开发笔记 > 编程语言 > 正文

等待使用异步方法的Task.Run不会在正确的线程上抛出异常

如何解决《等待使用异步方法的Task.Run不会在正确的线程上抛出异常》经验,为你挑选了1个好方法。

当运行下面的测试方法时,我发现即使我等待抛出异常的任务,测试也会通过.此外,弹出一个单独的窗口,说"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()
{
    Func func = async () =>
    {
        await Task.Delay(0);
        throw new InvalidOperationException();
    };
    await Task.Run(func);
}

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



1> Kirill Shlen..:

简单的调整:

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

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

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有