2011-05-06 137 views
1

我写了这个代码:.NET远程对象的生命周期

public class Message : MarshalByRefObject, IMessage 
{ 
    ... 

    public override object InitializeLifetimeService() 
    { 
     ILease leas = (ILease) base.InitializeLifetimeService(); 
     if (leas != null) 
     { 
      if(leas.CurrentState == LeaseState.Initial) 
      { 
       leas.InitialLeaseTime = TimeSpan.FromMilliseconds(2000); 
       leas.SponsorshipTimeout = TimeSpan.Zero; 
       leas.RenewOnCallTime = TimeSpan.Zero; 
      } 
     } 
     return leas; 
    } 
} 

是否InitializeLifetimeService受让人的覆盖是2秒后的对象是没有“垃圾收集”?我的意思是,独立的,如果这个实例是远程访问或不。

谢谢。

+0

你问2秒后对象是不是GC'd?因为代码看起来像你希望它在那之后被收集。 (事件虽然你没有改变10秒轮询的默认值) – Menahem 2011-05-06 07:51:04

+0

是的,我想在2秒后收集对象。我正在实施peer 2 peer模拟器,并且有一个消息在peer之间传播。我正在考虑分配超时后收集对象。我不知道这是否是最好的方法,但我没有看到另一种解决方法。 – aumanets 2011-05-06 11:52:33

+0

我希望在2秒后收集对象,而且我不希望更新通话时间。该代码是否可以保证这种行为? – aumanets 2011-05-06 12:51:25

回答

2

为了确保对象租约结束,您只需要将生命期服务的轮询间隔设置为低于您设置为生命期的2秒钟的时间。

您可以在服务器object`s构造做到这一点:

// just a sample value of 1 second 
LifetimeServices.LeaseManagerPollTime = TimeSpan.FromSeconds(1); 

现在即使你打电话mehods的对象, 它仍然会被收集,因为你设置:

leas.RenewOnCallTime = TimeSpan.Zero