c# - Try/Catch Wrap Around Task.Run 不处理异常

标签 c# .net try-catch task-parallel-library task

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

这是错误的图片:

enter image description here

此代码示例是否已过时或我是否遗漏了什么?

最佳答案

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

实际发生的是异常被抛出,然后被 .NET 框架(而不是用户代码)捕获,然后被放置到任务中。

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

不幸的是,调试器也没有很多替代品。当异常离开用户代码时,调试器无法“展望 future ”以了解异常将被放置在特定任务上并且您的代码将 await 该任务。它必须立即决定是否通知您,而不知道任务是否会被 awaited。

关于c# - Try/Catch Wrap Around Task.Run 不处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37282414/

相关文章:

c# - 通用节点的通用树 C#

c# - 拆分字符串时出错

c# - C#中合并嵌套If(C#中的短路关键字)

.net - 页面按钮的样式不同于选择按钮

c# - 从工具箱中的程序集隐藏所有 WPF 用户控件

Powershell tr​​y block 在 VSTS 构建上不起作用

c# - ADO.NET SQL Server 性能 : multiple result sets vs. 多个命令执行

c# - 事件是否保证会举行?

java - 什么时候使用 try multi catch?

java - 如何从 try、catch 和 finally 中返回一个值?