c# - 未处理的任务异常未拆除控制台应用程序

标签 c# task-parallel-library

我想弄清楚为什么我的控制台应用程序没有被未处理的任务异常破坏。我所做的就是创建一个任务,我会立即抛出异常。最后我强制GC。在第一个示例中,我有一个用于 TaskScheduler.UnobservedTaskException 事件的处理程序,我可以看到异常得到了处理。

 static async Task ThrowsException()
 {
     Console.WriteLine("Throwing!");
     throw new Exception("Test exception");
}

static void Main(string[] args)
{
    TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
    ThrowsException();
    Console.WriteLine("Collecting garbage.");
    GC.Collect();
    GC.WaitForPendingFinalizers();
    Console.WriteLine("Done collecting garbage.");
    Console.ReadKey();
}

static void TaskScheduler_UnobservedTaskException(object sender,
   UnobservedTaskExceptionEventArgs e)
{
    Console.WriteLine("Unobserved task exception occured in finalizer.");
    Console.WriteLine(e.Exception.InnerException.Message);
}

输出:

Throwing!
Collecting garbage.
Unobserved task exception occured in finalizer.
Test exception
Done collecting garbage.

但是如果我注释掉 TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException 行,程序仍然会运行到完成。在这种情况下,输出是:

Throwing!
Collecting garbage.
Done collecting garbage.

为什么在这种情况下应用程序没有崩溃?

最佳答案

不因未观察到的任务异常而使程序崩溃是针对 .NET 4.5 所做的更改,请参阅 remarks section of the MSDN for the event .如果您希望您的程序具有 .NET 4.5 之前的行为并导致它崩溃,您需要放入您的 app.config

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

这将带回旧行为。

关于c# - 未处理的任务异常未拆除控制台应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37816271/

相关文章:

c# - Membership.ValidateUser 方法如何访问数据库?

c# - 使用反射从 C# 对象中去除所有值

.net - 是否可以等待未知任务完成?

c# - 处理 Task.Factory.StartNew 的错误

c# - 如何在不等待的情况下安全地调用 C# 中的异步方法

c# - 是否有语句将元素 T 添加到 IEnumerable<T>

c# - 如何更改 asp.net mvc 中搜索 viewLocation 的顺序?

c# - 如何将 HSM 加密与 C# 集成?

c# - ContinueWith() 直到主机进程结束才执行

c# - 在达到一定的数据集大小后,并行代码是否应该比顺序代码运行得慢?