博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF 降低.net framework到4.0
阅读量:6328 次
发布时间:2019-06-22

本文共 2187 字,大约阅读时间需要 7 分钟。

原文:

1. 问题背景

由于xp系统上面最高只能安装.net framework 4.0,所以公司项目需要将原来项目的.net framework版本降低到4.0,具体的降版本很简单,只要把项目属性中的目标框架改成4.0,编译一下,解决一下出现的问题就可以了。但是在打包同事电脑上,登录界面都正常出来了,但是登录进去后,直接奔溃了。

2.解决问题

一开始检查了项目及其依赖文件的.net framework的版本,都是4.0,直接运行的是生成文件,中间没有更改任何文件,所以开始以下解决问题的道路。

(1)查找奔溃的dmp文件

程序的奔溃文件一般都在C:\Users\XXX\AppData\Local\CrashDumps目录下面,可惜的是,在同事电脑上面,没有发现崩溃文件。

(2)查找系统的事件日志

选中桌面计算机,右击,选择管理,在系统工具-》事件查看器-》自定义视图-》.NET Runtime, 双击,找到奔溃时间点的日志,找到如下的错误信息:

Application: XXXX.exe

Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.AggregateException
Stack:
   at System.Threading.Tasks.TaskExceptionHolder.Finalize()

因为项目中用到Task的地方只有一处,所以注释掉这段代码,在同事电脑上面试了一下,果然OK,程序正常运行。下面就是要看看具体是什么原因造成这个异常。

3. 问题原因

在stackoverflow上提到了:

If you create a Task, and you don't ever call task.Wait() or try to retrieve the result of a Task<T>, when the task is collected by the garbage collector, it will tear down your application during finalization. For details, see MSDN's page on .

The best option here is to "handle" the exception. 

根据上面的英文,我的理解是:当你创建一个Task,没有调用过task.Wait()或者没有获取它的执行结果,(如果Task中出现了未处理的异常),当这个Task被GC回收时,在GC finalization阶段,会让当前应用程序崩溃。

进一步看MSDN中的:

"Unhandled exceptions that are thrown by user code that is running inside a task are propagated back to the joining thread. ···Exceptions are propagated when you use one of the static or instance Task.Wait or Task(Of TResult).Wait methods···"

翻译:在一个task中运行的代码抛出的未处理异常会被回传给(创建该task的)主线程。···当你调用Task.Wait时,异常才会被回传(给主线程)。

分析:当我们遇到的情况是没调用Task.Wait,也就是异常没有被回传给主线程。下面的这句就提到了这个:

"If you do not wait on a task that propagates an exception, or access its Exception property, the exception is escalated according to the .NET exception policy when the task is garbage-collected."

译:如果你在一个task中没有等待异常被传播,或者访问它的异步特性,在task被GC回收时,该异常会遵循.NET异常策略被逐步升级。

分析:逐步升级的后果就是当前应用程序进程崩溃,对于ASP.NET程序来说,就是应用程序池崩溃。

4. 解决问题

最简单的方法就是捕获一下task中的异常,参考msdn中的代码大概如下:

1 var task1 = Task.Run(() => { throw new CustomException("task1 faulted."); }).ContinueWith( t => { Console.WriteLine("{0}: {1}", t.Exception.InnerException.GetType().Name, t.Exception.InnerException.Message); }, TaskContinuationOptions.OnlyOnFaulted); Thread.Sleep(500);

 

转载地址:http://kvwoa.baihongyu.com/

你可能感兴趣的文章
什么是.Net, IL, CLI, BCL, FCL, CTS, CLS, CLR, JIT
查看>>
Atlas Control ToolKit 发布
查看>>
Dundas 系列
查看>>
Windows的命令行查看,修改,删除,添加环境变量
查看>>
iOS 图文混排
查看>>
GC是什么? 为什么要有GC?
查看>>
JQuery EasyUi之界面设计——母版页以及Ajax的通用处理(三)
查看>>
童年记忆
查看>>
Selenium Python bindings 文档一
查看>>
directX的16位和24位的色彩模式
查看>>
WINDOWS 8
查看>>
ASP.NET MVC涉及到的5个同步与异步,你是否傻傻分不清楚?[下篇]
查看>>
spring(10)
查看>>
Ubuntu 12.04 LTS 及ubuntu14.10 -- NFS安装
查看>>
hdu 5063 Operation the Sequence(Bestcoder Round #13)
查看>>
django orm多条件查询及except处理不存在记录的样码
查看>>
ylbtech-QQ(腾讯)-群空间-数据库设计
查看>>
面试书籍
查看>>
模式识别 - 处理多个演示样本研究(MIL)特点(matlab)
查看>>
lintcode :Remove Duplicates from Sorted Array II 删除排序数组中的重复数字 II
查看>>