RenewOnCallTime | 120 |
SponsorshipTimeout | 120 |
LeaseManagerPollTime | 10 |
Обновление аренды
Как показано в таблице, время аренды по умолчанию для объекта составляет 300 секунд. Если клиент вызывает метод на объекте, когда аренда истекла, возникает исключение. Если имеется клиент, где удаленный объект может понадобиться на время более 300 с, то существует три способа обновления аренды:
□ Неявное обновление делается автоматически, когда клиент вызывает метод на удаленном объекте. Если текущее время аренды меньше, чем значение RenewOnCallTime
, то аренда задается как RenewOnCallTime
.
□ При явном обновлении клиент определяет новое время аренды. Это делается с помощью метода Renew()
из интерфейса ILease
. Доступ к интерфейсу ILease
можно получить, вызывая метод GetLifetimeService()
на прозрачном прокси.
□ Третьей возможностью обновления аренды является спонсорство. Клиент может создать спонсора, который реализует интерфейс ISponsor
и регистрирует спонсора в службах аренды с помощью метода Register()
из интерфейса ILease
. Когда аренда заканчивается, у спонсора запрашивают ее продления. Механизм спонсорства используется, если на сервере требуются долгоживущие удаленные объекты.
Классы, используемые для управления временем жизни
ClientSponsor
является спонсором, который реализует интерфейс ISponsor
. Он применяется на клиентской стороне для продления аренды. С помощью интерфейса ILease
можно получить всю информацию об аренде, все свойства аренды, а также время и состояние текущей аренды. Состояние определяется с помощью перечисления LeaseState
. С помощью служебного класса LifetimeServices
можно получить и задать свойства аренды для всех удаленных объектов в домене приложения.
Пример: получение информации об аренде
В этом небольшом примере кода доступ к информации аренды осуществляется с помощью вызова метода GetLifetimeService()
на прозрачном прокси. Для интерфейса ILease
необходимо открыть пространство имен System.Runtime.Remoting.Lifetime
:
Помните, что эти действия годятся только для активизированных клиентом объектов. Экземпляры объектов SingleCall
создаются для каждого вызова метода, поэтому механизм аренды не используется.
ILease lease = (ILease)obj.GetLifetimeService();
if (lease != null) {
Console.WriteLine('Lease Configuration:');
Console.WriteLine(
'InitialLeaseTime: ' + lease.InitialLeaseTime);
Console.WriteLine(
'RenewOnCallTime: ' + lease.RenewOnCallTime);
Console.WriteLine(
'SponsorshipTimeout: ' + lease.SponsorshipTimeout);
Console.WriteLine(lease.CurrentLeaseTime);
}
В результате получается следующий вывод в окне клиентской консоли:

Изменение используемых по умолчанию конфигураций аренды
Сам сервер может изменить используемую по умолчанию конфигурацию аренды для всех удаленных объектов, используя служебный класс System.Runtime.Remoting.Lifetime.LifetimeServices
:
LifetimeServices.LeaseTime = TimeSpan.FromMinutes(10);
LifetimeServices.RenewOnCallTime = TimeSpan.FromMinutes(2);
Если требуются другие используемые по умолчанию значения параметров времени жизни, в зависимости от типа удаленного объекта, можно изменить конфигурацию аренды удаленного объекта, переопределяя метод InitializeLifetimeService()
базового класса MarshalByRefObject
:
public class Hello : System.MarshalByRefObject {
public Hello() {
Console.WriteLine('Constructor called');
}
~Hello() {
Console.WriteLine('Destructor called');
}
public override Object InitializeLifetimeService() {
ILease lease = (ILease)base.InitializeLifetimeService();
lеase.InitialLeaseTime = TimeSpan.FromMinutes(10);
lease.RenewOnCallTime = TimeSpan.FromSeconds(40);
return lease;
}