【问题标题】:.Net CLR Unloading vs shutdown?.Net CLR 卸载与关闭?
【发布时间】: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 ...?
  • [在 IIS 世界中] 这是否意味着 IIS 重置?

请问,我可以稍微解释一下吗?

【问题讨论】:

  • 不要认为CLR 有任何类型的关闭,很可能这只是一种说/考虑卸载的方式......

标签: c# .net garbage-collection clr appdomain


【解决方案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/…
猜你喜欢
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多