远程回调对象的生命周期

时间:2012-06-17 14:34:18

标签: c# .net remoting .net-remoting

我写了一段类似于这篇文章中的例子的代码: .NET Remoting callback (将回调对象传递给远程方法)。

正如我发现的那样,如果我没有覆盖MarshalByRefObject.InitializeLifetimeService() 过了一会儿,服务器调用回调失败了。 所以我重写它以返回null(无限生命期)并且它可以工作。

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

  1. 这样的物体会像往常一样由GC收集,还是因为它是远程的而保持活着?
  2. 我找到了这种方法:RemotingServices.Disconnect()
  3. 如果我在回调对象上调用它,是否会保证生命周期策略变得无关紧要并且会被垃圾收集?

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

    谢谢, 吉尔。

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

2 个答案:

答案 0 :(得分:3)

好吧,这种方法似乎证明了这一点。

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

答案 1 :(得分:0)

如果重写InitializeLifetimeService并返回null,则永远不会对您的对象进行垃圾回收。

如果您不希望您的实例永远存在,那么您需要进入赞助商和租约 - 基本上,当.NET即将到期时,您会得到一个回调,并且GC会对象进行回调,这样您就有机会续订租约。

有关赞助和租赁的详细概述,请参阅http://msdn.microsoft.com/en-us/magazine/cc300474.aspx