我在.Net 4.0中构建了一个小示例应用程序来测试一些任务异常处理。我写了下面的代码
Task.Factory.StartNew(() =>
{
throw new Exception("Exception");
}
Thread.Sleep(100);
GC.Collect();
GC.WaitForPendingFinalizers();我预计,由于我的应用程序是NET4.0,我会得到一个未处理的异常,但什么也没有发生。我在文章UnobservedTaskException is not killing the process中看到,即使你的应用程序是.Net 4.0,如果你安装了Net Framework4.5,它以后也会在上面运行。
事实上,当我补充说:
<runtime>
<ThrowUnobservedTaskExceptions enabled="true"/>
</runtime> 与4.5中的应用程序一样,会抛出异常
谁能解释一下应用程序版本和安装的框架版本的一般原则是什么?
发布于 2016-07-07 20:50:11
“一般原则”是,当您最初在项目中以4.0为目标时,.NET版本4.5和更高版本的行为将尽可能像.NET 4.0。多亏了编译器嵌入到程序集中的[TargetFrameworkAttribute](https://msdn.microsoft.com/en-us/library/system.runtime.versioning.targetframeworkattribute(v=vs.110%29.aspx),它才知道目标是什么。
当然,这是非常重要的,.NET 4.5中的设计变化是严重的 breaking。你不会希望之前忽略了这个异常并一直在运行的.NET 4.0应用程序在运行在更新的运行时版本时突然失败。比您想象的要常见得多,特别是在没有合适的方法来发现这些异常的情况下。这是一个非常糟糕的设计选择,微软在4.5版本中对其进行了更正
它只有一些配置设置,您可以使用它们来覆盖这种兼容性行为,ThrowUnobservedTaskExceptions就是其中之一。将行为反向移植到4.0应用程序被认为是有用的,它肯定是有用的。如果你在一台只有4.0版本的机器上运行你的应用程序,那么它不会有任何效果。另一个例子是is here。
执行此操作的代码是located here。内部System.CLRConfig类是4.5中的新功能。实际的实现在CLR中,因为解析.config文件的代码也位于CLR中。
https://stackoverflow.com/questions/38243638
复制相似问题