曾经写过一篇文章:
.NET(C#) TPL:Task中未觉察异常和TaskScheduler.UnobservedTaskException事件
讲述在.NET 4.0中,Task的未觉察状态的异常会在垃圾回收时终结器执行线程中被抛出,像其他未处理异常一样,这个异常会使整个进程崩溃。而在.NET Framework 4.5 beta后,这个有所改变,这个未觉察的异常不会引发进程崩溃。
所以下面在.NET Framework 4.0中会发生异常的代码在.NET Framework 4.5 beta中不会发生异常。
//在Task中抛出异常
Task.Factory.StartNew(() =>
{
throw new Exception();
});
//确保任务完成
Thread.Sleep(100);
//强制垃圾会受到
GC.Collect();
//等待终结器处理
GC.WaitForPendingFinalizers();
当然如果想在.NET Framework 4.5 beta中维持.NET Framework 4.0的做法,可以在应用程序配置文件中把运行时刻的ThrowUnobservedTaskExceptions设置成True(默认当然是False)就可以了。
<configuration>
<runtime>
<ThrowUnobservedTaskExceptions enabled="true"/>
</runtime>
</configuration>
在运行上面的代码,异常会再次被抛出并引发进程崩溃。