sym*_*rus 5 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);
}
Run Code Online (Sandbox Code Playgroud)
输出:
Throwing!
Collecting garbage.
Unobserved task exception occured in finalizer.
Test exception
Done collecting garbage.
Run Code Online (Sandbox Code Playgroud)
但如果我注释掉该行TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException,程序仍然会运行完成.在这种情况下,输出是:
Throwing!
Collecting garbage.
Done collecting garbage.
Run Code Online (Sandbox Code Playgroud)
为什么应用程序在这种情况下不会崩溃?
不会因未观察到的任务异常而使程序崩溃是为 .NET 4.5 所做的更改,请参阅MSDN的备注部分了解事件。如果您希望您的程序具有 .NET 4.5 之前的行为并导致它崩溃,您需要放入 app.config
<configuration>
<runtime>
<ThrowUnobservedTaskExceptions enabled="true"/>
</runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)
这将带回旧的行为。