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

标签 c# asynchronous

在运行下面的测试方法时,我发现即使我等待一个抛出异常的任务,测试也会通过。此外,还会弹出一个单独的窗口,提示“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/

相关文章:

c# - 引发 FileSystemWatcher.Changed 事件时程序退出 (C#)

java - 从异步运行的 lambda 访问方法参数

c++ - 我不明白异步操作如何使 HTTP 服务器并发

node.js - NodeJS 进程 'uncaughtException' 在某些情况下不工作

c# - 主要权限(属性)如何工作?

c# - 找不到 CodeDom 提供程序类型 "Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider"

javascript - 循环多个 ajax 请求后 Promises.all 未触发

javascript - Durandal JS 和 Google Plus 登录 Javascript API

c# - Json.net 仅序列化数组的一部分

c# - 如何从 C# XML 注释中引用构造函数?