我一直在学习使用 TPL 并且对我从这个 article 中收集的示例有疑问.我完全按照 Task.Run 示例中的代码复制并粘贴了代码,但收到一条错误消息,指出未处理异常:
private async void button1_Click(object sender, EventArgs e)
{
try
{
await Task.Run(() =>
{
Thread.Sleep(1000);
throw new InvalidOperationException("Hi!");
});
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
这是错误的图片:
此代码示例是否已过时或我是否遗漏了什么?
最佳答案
这只是一个误导性的调试器消息。
实际发生的是异常被抛出,然后被 .NET 框架(而不是用户代码)捕获,然后被放置到任务中。
因此,虽然技术上错误消息是正确的(它被 .NET 框架捕获 - 未被用户代码处理),但在这种情况下并不是很有用。
不幸的是,调试器也没有很多替代品。当异常离开用户代码时,调试器无法“展望 future ”以了解异常将被放置在特定任务上并且您的代码将 await
该任务。它必须立即决定是否通知您,而不知道任务是否会被 await
ed。
关于c# - Try/Catch Wrap Around Task.Run 不处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37282414/