c# - 为什么抛出异常时应用程序不会崩溃

标签 c# multithreading async-await task-parallel-library

<分区>

在 WPF 应用程序中,我添加了两个按钮,一个用于启动任务,另一个用于强制运行 GC:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Task.Run(() =>
        {
            throw new Exception("Some Exception");
        });
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();
    }

任务只是抛出一个异常。

在发布配置中运行应用程序时,我按了第一个按钮,然后按了第二个按钮,我预计应用程序会崩溃。无论我按下按钮多少次,都不会发生这种情况。

我知道 .NET 4.5 中未观察到的任务吞并异常的行为:https://blogs.msdn.microsoft.com/pfxteam/2011/09/28/task-exception-handling-in-net-4-5/

我很困惑,但是为什么一旦 GC 运行,应用程序就不会崩溃。根据我的理解,一旦收集到任务,就应该抛出异常。

另请注意,我知道这个问题没有回答我的问题 Why doesn't my process terminate when Task has unhandled exception?

标记为答案的评论建议使用 ContinueWith 但这也不起作用,应用程序没有崩溃,异常被吞没:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Task.Run(() =>
        {
            throw new Exception("Some Exception");
        }).ContinueWith(t =>
        {
            if (t.IsFaulted) { throw t.Exception.InnerException; }
        });
    }

我已经知道等待任务会使应用程序崩溃。

最佳答案

I am confused however why once GC runs, the app doesn't crash. Per my understanding, Once the task is collected the eception should be thrown.

如果您通过将以下元素添加到 App.config 来使用旧行为(.NET Framework 4.5 之前),您的理解是正确的:

<runtime>
    <ThrowUnobservedTaskExceptions enabled="true"/>
</runtime>

如果您不这样做,UnobservedTaskException 不会导致进程崩溃。尽管仍会引发异常,因此您可以在这两种情况下处理 TaskScheduler.UnobservedTaskException 事件。

关于c# - 为什么抛出异常时应用程序不会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51041397/

相关文章:

multithreading - Unity : How to use all CPU cores for Camera. 使用多线程图形作业渲染?优化 - 不起作用?

c - 静态常量变量是线程安全的吗?

c# - 如何在C#中计算每月的第二个星期五

C#跨线程调用问题

c# - 缓存 Linq 查询问题

c# - 我如何使用 Func<> 修改 lambda 的单个条件

java - 自定义任务执行器或 "am I reinventing the wheel?"

javascript - Async/Await 无法获取 JSON 数据

ajax - 尝试测试异步Dart Ajax HttpRequest时出错

javascript - 有没有一种方法可以通过 wikipedia api 的一次提取请求来搜索页面并提取其信息?