#.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