.Net CLR 卸载与关闭?
Posted
技术标签:
【中文标题】.Net CLR 卸载与关闭?【英文标题】:.Net CLR Unloading vs shutdown? 【发布时间】:2012-04-07 13:22:38 【问题描述】:什么导致 Finalize 方法被调用?
此问题的 2 个答案(共 4 个)是:
The CLR is unloading an AppDomain
当 AppDomain 卸载时,CLR 认为
AppDomain 中没有任何内容可以作为根,并且垃圾收集包括
所有世代都被执行。
The CLR is shutting down
进程正常终止时CLR关闭
(例如,与通过任务管理器进行外部关闭相反)。
我假设The CLR is unloading an AppDomain
是程序(例如控制台 [exe])正在关闭(通过按关闭/程序正常结束)
The CLR is shutting down
呢? 继续上面的 [Exe] 程序类比:
请问,我可以稍微解释一下吗?
【问题讨论】:
不要认为CLR
有任何类型的关闭,很可能这只是一种说/考虑卸载的方式......
【参考方案1】:
AppDomain 是比 Process 更细化的单元。一个 Process 可以有多个 AppDomain 实例,每个实例都可以单独卸载。
CLR 关闭是进程终止。
AppDomain卸载是每个AppDomain分开的。
(虽然我个人不会保证,在不检查文档的情况下,所有终结器等都会在任何一种情况下执行)
例如,我在一个长时间运行的自更新 Windows 服务中使用了多个 AppDomain 实例;当检测到新版本时,它会拉下新的二进制文件,生成一个新的 AppDomain,让它运行,将未来的操作切换到新的 AppDomain,并卸载旧的 AppDomain(当运行的操作完成时)。
【讨论】:
+1 我实际上在想什么,但不确定要发帖:) 我在运行简单的控制台应用程序....它有 1 个 AppDomain 和 1 个进程....不是吗? @Royi 是的,一个简单的控制台 exe 有一个进程和一个 AppDomain 不过,没有什么能阻止您在控制台应用程序中生成另一个 AppDomain。 @Tigran 这是一个关于 XP 和 Vista 的 CAD 示例,看起来也是桌面:dwf.blogs.com/beyond_the_paper/2009/04/…以上是关于.Net CLR 卸载与关闭?的主要内容,如果未能解决你的问题,请参考以下文章