我在.Net 4.0中构建一个小样本应用程序来测试一些任务异常处理。我写下面的代码
Task.Factory.StartNew(() =>
{
throw new Exception("Exception");
}
Thread.Sleep(100);
GC.Collect();
GC.WaitForPendingFinalizers();
我预计,因为我的应用程序是net 4.0,我将得到一个未处理的异常,但没有任何反应。我在帖子UnobservedTaskException is not killing the process中看到即使您的应用程序是.Net 4.0,如果您安装了Net framework 4.5,它也会在稍后运行。
确实,当我补充说:
<runtime>
<ThrowUnobservedTaskExceptions enabled="true"/>
</runtime>
与4.5中的应用程序一样抛出异常
有人可以解释有关应用程序版本和已安装框架版本的一般原则是什么?
答案 0 :(得分:2)
“一般原则”是,当您最初在项目中定位4.0时,.NET 4.5及更高版本将尽可能像.NET 4.0一样运行。由于编译器嵌入在程序集中的[TargetFrameworkAttribute],它知道您的目标。
当然,这非常重要,.NET 4.5中的这种设计变化是严重突破。您不希望.NET 4.0应用程序以前忽略该异常,并且当它在较新的运行时版本上运行时仍然会突然失败。比较常见的是你可以假设的,特别是因为没有一个合适的方法来发现这些异常。这是一个非常糟糕的设计选择,微软在4.5
中对其进行了修正它只有一些配置设置可用于覆盖此兼容性行为,ThrowUnobservedTaskExceptions就是其中之一。将行为反向移植到4.0应用程序被认为是有用的,它当然是。如果您在仅具有4.0的计算机上运行您的应用程序,则它无效。另一个例子is here。
执行此操作的代码是located here。内部System.CLRConfig类是4.5中的新增功能。实际的实现在CLR中,因为解析.config文件的代码也位于那里。