ISponsor 和 ILease 接口如何工作?

dmc*_*mck 5 .net c# object-lifetime .net-remoting

我创建了一个继承自MarshalByRefObject和的对象ISponsor。在我的实现中,ISponsor我只返回一个时间跨度来指示我希望对象更新多长时间。

当我调用InitializeLifetimeService()以获取ILease要传递到我的ISponsor对象中的引用时,它似乎从未在我见过的示例中使用

ISponsor似乎只是在没有实际使用ILease参考的情况下返回一个 TimeSpan 。但我敢肯定,由于涉及远程处理,这里还有更多事情要做。

如何工作ISponsorILease工作,特别是在对象生命周期更新方面?

Sim*_*les 5

在您想要延长远程对象租约的客户端应用程序中,您通常会通过调用获得该对象的 ILease 接口

ILease lease = (ILease)RemotingServices.GetLifetimeService( remoteObject );
Run Code Online (Sandbox Code Playgroud)

然后将您的自定义赞助商对象传递给它

lease.Register( customSponsor );
Run Code Online (Sandbox Code Playgroud)

您的自定义赞助商课程将如下所示:

private class CustomSponsor : MarshalByRefObject, ISponsor
{
    public TimeSpan Renewal(ILease lease)
    {
        Debug.Assert(lease.CurrentState == LeaseState.Active);
        //Renew lease by 5 minutes

        return TimeSpan.FromMinutes(5);
    }
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看有关租赁和赞助的这篇有用的 MSDN 文章。 http://msdn.microsoft.com/en-us/magazine/cc300474.aspx

该链接不再有效——它出现在 2003 年 12 月的问题中,但可以从同一页面以 CHM 格式下载。

回程机链接在这里:

https://web.archive.org/web/20080906214332/http://msdn.microsoft.com/en-us/magazine/cc300474.aspx


Ale*_*kov 4

InitializeLifetimeService在父 AppDomain 中,您可以通过调用GetLifetimeService新 AppDomain 中对象的代理实例来获取 ILease 对象。您永远不需要自己实现ILease(除了测试您的ISponsor实现之外)。

然后您注册自定义 Sponsor 对象,该对象ISponsor通过ILease.Register调用实现并配置ILease具有超时的对象。

当您的 Sponsor 对象被调用时,Renewal您可以说出该对象保持活动状态的时间,也可以调整/显示传入实例的属性ILease