多个 AppDomain 之间的交互。销毁单例对象的问题

Posted

技术标签:

【中文标题】多个 AppDomain 之间的交互。销毁单例对象的问题【英文标题】:Interaction between multiple AppDomain. Problems with the destruction of singleton-objects 【发布时间】:2010-03-25 06:42:27 【问题描述】:

问题如下。有一个应用程序正在创建其他 AppDomain 并在那里加载程序集(自定义用户脚本)。 在主应用程序中,有一些对象,引用这些对象将所有权转移给那些创建的 AppDomain。 对象本身是 MarshalByRefObject,它们是禁用的生命周期服务(InitializeLifetimeService 返回 null)。

所有这些都有效。然而,这些 AppDomain 的创建和销毁......由于卸载域引起的破坏,以及对创建对象的引用 - 都被遗忘了。

一般来说,作为逐渐内存结束的结果,因为这些“被遗忘”的对象似乎没有被释放,尽管它​​们在任何地方都没有链接,而且作为链接的 AppDomain 早就被卸载了......

因此问题是 - 错误在哪里?怎么了?为什么不卸载域名后豁免设施?

没有人想到- 考虑到自己链接到这些对象的每个域加载,并在他卸载后- 导致每个对象RemotingServices.Disconnect(...)。当终身服务不可用时,它可能必须这样做?

【问题讨论】:

【参考方案1】:

我会进行以下更改:

为这些类型实现 IDisposable 和 ISponsor。覆盖这些类型的 InitializeLifetimeService 方法,而不是返回 null,而是让每个实例成为自己的赞助商。

这些类型应该从 Renewal 返回一个正的 TimeSpan,直到它们被释放。只需确保在销毁 appdomain 之前将它们处理掉即可。

【讨论】:

以上是关于多个 AppDomain 之间的交互。销毁单例对象的问题的主要内容,如果未能解决你的问题,请参考以下文章

静态对象和全局对象的销毁顺序是啥?

单例对象的创建与销毁

1. 单例模式

设计模式之单例模式

设计模式:Android源码中的单例模式

多个 .NET AppDomain 的代码示例