Срок службы объекта удаленного доступа .NET

#.net #object #remoting #.net-remoting #lifetime

#.net #объект #удаленный доступ #.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 секунды объект не является «собранным мусором»? Я имею в виду, независимо от того, был ли удаленный доступ к этому экземпляру или нет.

Спасибо.

Комментарии:

1. вы спрашиваете, не будет ли объект GC’d через 2 секунды? потому что код выглядит так, как будто вы ХОТИТЕ, чтобы он был собран после этого. (событие, хотя вы не изменили значение по умолчанию для 10-секундного опроса)

2. Да, я хочу, чтобы объект был собран через 2 секунды. Я внедряю одноранговый симулятор 2-х одноранговых узлов, и между одноранговыми узлами циркулирует сообщение. Я думал назначить время ожидания, после которого объект собирается. Я не знаю, лучший ли это способ сделать это, но я не вижу другого способа решить эту проблему.

3. Я хочу, чтобы объект был собран через 2 секунды, и я не хочу продлевать время жизни при вызове. Гарантирует ли этот код такое поведение?

Ответ №1:

Чтобы убедиться, что аренда объекта заканчивается, вам нужно всего лишь установить интервал опроса службы life time на что-то меньшее, чем 2 секунды, которые вы установили в качестве срока службы.

вы можете сделать это в конструкторе серверного объекта:

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

теперь, даже если вы вызываете методы для объекта,
он все равно будет собран, поскольку вы установили:

 leas.RenewOnCallTime = TimeSpan.Zero