我一直在学习使用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
编码。
关于c# - 尝试/捕获绕回Task.Run不处理异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37282414/