我一直在学习使用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);
    }
}

这是错误的图片:

c# - 尝试/捕获绕回Task.Run不处理异常-LMLPHP

该代码示例是否已过时,或者我缺少某些内容?

最佳答案

这只是一个误导性的调试器消息。

实际发生的情况是先引发异常,然后由.NET框架(不是用户代码)捕获异常,然后将其放置在任务上。

因此,尽管从技术上讲错误消息是正确的(由.NET框架捕获-由用户代码未处理),但在这种情况下它并不是很有用。

不幸的是,调试器也没有很多替代品。在异常离开用户代码的那一刻,调试器无法“展望 future ”来知道该异常将放置在特定任务上,并且您的代码将对该任务进行await。它必须立即做出是否通知您的决定,而不必知道该任务是否将被await编码。

关于c# - 尝试/捕获绕回Task.Run不处理异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37282414/

10-12 00:30
查看更多