我不是悄悄吞噬异常的忠实粉丝,但是下面的代码确实如此:
Task.Run(() =>
{
var obj = DoSomethingCpuIntensive(); // returns null, due to a bug
obj.DoMoreStuff();
Console.WriteLine("after"); // never get here; program continues running
});
Run Code Online (Sandbox Code Playgroud)
我已经阅读了ThrowUnobservedTaskExceptions配置值,但这没有用,因为我从不对Task返回做任何事情(编辑:实际上它确实有帮助,但只在Release版本中).
有没有办法让这个未处理的异常崩溃程序?我是否Task.Run以某种方式使用我不应该这样做?
看来Task.Run这样使用确实是一个错误。我想我应该await这样做,否则就会发生像上面这样的愚蠢的事情。
当它确实因 而崩溃时await,调试器毫无帮助,如下所示:

我认为这一切都意味着我在这里确实做错了事Task.Run。
一个简单的修复方法是使用旧的ThreadPool.QueueUserWorkItem:

这样好多了!无论如何,我在这段代码中实际上并不需要 async/await ;我只是使用它,Task.Run因为它打字较少。