【问题标题】:remoting callback object lifetime远程回调对象生命周期
【发布时间】:2012-06-17 14:34:17
【问题描述】:

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

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

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

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

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

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

谢谢, 吉尔。

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

【问题讨论】:

  • .NET 远程处理比 WCF 强大得多。我仍然不知道为什么它作为替代品出售。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 即使我使用 RemotingServices.Disconnect() 也是如此吗?
    • 杂志链接不再有效 - 根据stackoverflow.com/a/25315226/155892,它在 2003 年 12 月 期中,但可以从同一页面以 CHM 格式下载。
    猜你喜欢
    • 2011-04-11
    • 2021-06-04
    • 2011-02-19
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多