我想弄清楚为什么我的控制台应用程序没有被未处理的任务异常破坏。我所做的就是创建一个任务,我会立即抛出异常。最后我强制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/