我写了一段类似于这篇文章中的例子的代码:.NET 远程处理回调(将回调对象传递给远程方法)。
正如我发现的那样,如果我不覆盖MarshalByRefObject.InitializeLifetimeService()
一段时间后,服务器调用回调失败。所以我覆盖了它以返回 null(无限生存期)并且它可以工作。
但现在我有点担心垃圾收集:
- 这样的对象会像往常一样被 GC 收集,还是因为它被远程处理而保持活动状态?
- 我找到了这种方法:
RemotingServices.Disconnect()
如果我在我的回调对象上调用它,它是否会保证生命周期策略变得无关紧要并且会被垃圾回收?
如果我做得对,我想要专家意见。
谢谢吉尔。
附言。我在 .NET 2.0 的约束下工作,因此切换到 WCF 的建议虽然正确,但无关紧要。:)
好的,似乎这种方法证明了自己。
我通过在 MarshalByRefObject.InitializeLifetimeService()
中返回 null 来使用无限租约。
然后,调用 RemotingServices.Disconnect()
允许正确释放对象。
如果重写 InitializeLifetimeService 并返回 null,则对象将永远不会被垃圾回收。
如果您不希望您的实例永远存在,则需要进入发起人和租约 - 基本上,当 .NET 即将使租约过期并 GC 对象时,您会收到一个回调,让您有机会续订租约。
有关赞助和租赁的良好概述,请参阅 http://msdn.microsoft.com/en-us/magazine/cc300474.aspx。