Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么应用程序没有';当抛出异常时不会崩溃_C#_Multithreading_Async Await_Task Parallel Library - Fatal编程技术网

C# 为什么应用程序没有';当抛出异常时不会崩溃

C# 为什么应用程序没有';当抛出异常时不会崩溃,c#,multithreading,async-await,task-parallel-library,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(objec

在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();
    }
任务只是抛出一个异常

在Release config中运行应用程序时,我先按第一个按钮,然后按第二个按钮,我希望应用程序崩溃。不管我按多少次按钮,这都不会发生

我知道.NET 4.5中未观察到的任务吞咽异常的行为:

然而,我很困惑,为什么一旦GC运行,应用程序就不会崩溃。根据我的理解,一旦任务被收集,eception应该被抛出

另请注意,我知道这个问题没有回答我的问题

标记为“答案”的注释建议使用
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; }
        });
    }

我已经意识到等待任务会导致应用程序崩溃。

这是因为你发射并忘记了。异常将在单独的线程中发生。如果你想让它崩溃,你必须等待它或使它同步

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

这是因为你开枪然后忘记了。异常将在单独的线程中发生。如果你想让它崩溃,你必须等待它或使它同步

private void Button_Click(object sender, RoutedEventArgs e)
{
    await Task.Run(() =>
    {
        throw new Exception("Some Exception");
    });
}
然而,我很困惑,为什么一旦GC运行,应用程序就不会崩溃。根据我的理解,一旦任务被收集,eception应该被抛出

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

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

如果不这样做,
未观察到的taskeexception
不会导致进程崩溃。但仍会引发异常,因此您可以处理
TaskScheduler.UnobservedTaskException
事件

然而,我很困惑,为什么一旦GC运行,应用程序就不会崩溃。根据我的理解,一旦任务被收集,eception应该被抛出

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

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



如果不这样做,
未观察到的taskeexception
不会导致进程崩溃。但是仍然会引发异常,因此您可以处理
任务调度程序。在这两种情况下都无法观察到taskeexception
事件。

我知道异常发生在另一个线程上。为什么应用程序没有崩溃?如果使用
new thread()
创建线程并在线程的方法上引发异常,则应用程序将崩溃。那么,为什么在使用Task.Run时它不会崩溃呢?请注意,我提到过我也知道“未观察到的任务”。我知道如果我打电话给Wait,它会工作的。这不是我要问的。异常发生在另一个任务上,而不是在一个裸线程上。任务捕获异常,线程杀死AppDomain@bommelding你看过我的问题了吗?我已经知道了。@DonBox实际的问题是什么?未观察到的异常不应使应用程序崩溃。解决方案是添加适当的异常处理并实际观察任务。处理事件只是作为最后的手段。我知道异常发生在另一个线程上。为什么应用程序没有崩溃?如果使用
new thread()
创建线程并在线程的方法上引发异常,则应用程序将崩溃。那么,为什么在使用Task.Run时它不会崩溃呢?请注意,我提到过我也知道“未观察到的任务”。我知道如果我打电话给Wait,它会工作的。这不是我要问的。异常发生在另一个任务上,而不是在一个裸线程上。任务捕获异常,线程杀死AppDomain@bommelding你看过我的问题了吗?我已经知道了。@DonBox实际的问题是什么?未观察到的异常不应使应用程序崩溃。解决方案是添加适当的异常处理并实际观察任务。处理事件只是作为最后手段。您的框架是什么?您是否设置了ThrowUnservedTaskExceptions?您没有在任何地方使用
async/await
。您正在启动任务,并且从不检查它是否成功或失败。如果您这样做了,即如果您编写了
wait Task.Run(()=>throw new Exception(…)
异常将在
wait
之后重新启动。如果将
元素添加到配置文件中,然后按第一个按钮,然后按第二个按钮,则进程将崩溃。这是预期的行为。看看我的答案。顺便说一句,应用程序不会崩溃,因为它不应该崩溃。未观察到的任务异常不会使应用程序崩溃。首先,不要更改默认行为,否则可能会破坏依赖它的库。其次,检查事件的文档。它解释了当服务器任务异常发生时,
进程在默认情况下不会终止。
您的框架是什么,您是否设置了ThrowUnobservedTaskExceptions?您没有在任何地方使用
async/await
。您正在启动任务,并且从不检查它是否成功或失败。如果您这样做了,即如果您编写了
wait Task.Run(()=>throw new Exception(…)
异常将在
wait
之后重新启动。如果将
元素添加到配置文件中,然后按第一个按钮,然后按第二个按钮,则进程将崩溃。这是预期的行为。看看我的答案。顺便说一句,应用程序不会崩溃,因为它不应该崩溃。未观察到的任务异常不会使应用程序崩溃。首先,不要更改默认行为,否则可能会破坏依赖它的库。其次,检查事件的文档。它解释了当发生Unobserved服务器任务异常时,
进程默认情况下不会终止。好的,那么如何处理
TaskScheduler.UnobservedTaskException
而不设置
ThrowUnobservedTaskExceptions enabled=“true”
?就像处理任何