3

我写了一段与这篇文章中的示例类似的代码: .NET Remoting callback (Pass a callback object to a remote method)。

我发现,如果我没有覆盖MarshalByRefObject.InitializeLifetimeService() 一段时间后,服务器调用回调失败。所以我重写了它以返回 null (无限生命周期)并且它可以工作。

但现在我有点担心垃圾收集器:

  1. 这样的对象会像往常一样被 GC 收集,还是因为它被远程而保持活动状态?
  2. 我找到了这个方法:RemotingServices.Disconnect()

如果我在回调对象上调用它,它会保证生命周期策略将变得无关紧要并且将被垃圾收集吗?

如果我做得对,我想要专家意见。

谢谢,吉尔。

PS。我在 .NET 2.0 的约束下工作,因此建议切换到 WCF,虽然正确,但无关紧要。:)

4

2 回答 2

3

好的,看来这种方法证明了自己。

我通过在中返回 null 来使用无限租约MarshalByRefObject.InitializeLifetimeService()
然后,调用RemotingServices.Disconnect()允许对象被正确释放。

于 2013-06-13T09:02:02.810 回答
0

如果您覆盖 InitializeLifetimeService 并返回 null,您的对象将永远不会被垃圾回收。

如果您不希望您的实例永远存在,那么您需要进入 Sponsors and Leases - 基本上,当 .NET 即将到期租约和 GC 对象时,您会收到回调,让您有机会续订租约。

请参阅http://msdn.microsoft.com/en-us/magazine/cc300474.aspx,了解有关赞助和租约的详细信息。

于 2012-10-03T22:48:18.013 回答