GetLifetimeService

Метод предоставляет объект, который управляет временем существования данного экземпляра класса. Этот объект используется при распределенной сборке мусора.

Клиентские приложения могут создавать на сервере различные объекты. Некоторые объекты (типа SingleCall) уничтожаются сразу после вызова метода и освобождают использованные ресурсы.

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

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

Время аренды по умолчанию для объекта составляет 300 секунд.

Если клиентское приложение вызывает метод на объекте, когда аренда истекла, возникает исключение SecurityException.

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

  1. неявное обновление делается автоматически, когда клиентское приложение вызывает метод на удаленном объекте. Если текущее время аренды меньше, чем значение RenewOnCallTime, то аренда задается как RenewOnCallTime;

  2. при явном обновлении клиентское приложение устанавливает новое время аренды. Это делается с помощью метода Renew() из интерфейса ILease. Доступ к интерфейсу ILease можно получить, вызывая метод GetLifetimeService() на прозрачном прокси-сервере;

  3. третьей возможностью обновления аренды является так называемое «спонсорство». Клиентское приложение может создать спонсора, который размещается там же, где и арендуемый объект.

Спонсор – это такой объект, которому клиентское приложение передало право управлять активностью созданных им на удаленном компьютере объектов после завершения своей работы.

Спонсор реализует интерфейс ISponsor и регистрирует себя в службах аренды с помощью метода Register() из интерфейса ILease. Когда аренда заканчивается, то длительность её продления запрашивается у спонсора, а не у клиентского приложения (которое к этому времени может быть недоступно или неактивно). Механизм спонсорства используется, если на сервере требуются долгоживущие удаленные объекты.

Распределенная сборка мусора управляет временем жизни серверных объектов и отвечает за их удаление по истечении времени жизни. Обычно распределенная сборка мусора использует подсчет ссылок на объект и тестовый опрос для решения вопроса о возможности удаления мусора от объекта. Это хорошо срабатывает, если на один объект приходится несколько клиентских приложений, но с их увеличением до тысяч на каждый объект такая распределенная сборка мусора работает все хуже. В такой ситуации служба времени жизни объекта может принимать функцию традиционного распределенного сборщика мусора и хорошо масштабируется при увеличении количества клиентов.

Синтаксис
public Object GetLifetimeService();
Возвращаемое значение

Объект типа ILease, используемый для управления политикой времени существования данного экземпляра.

Исключения
SecurityException У непосредственно вызывающего объекта отсутствует разрешение инфраструктуры.
Примеры

1) Получение информации об аренде.

Для интерфейса ILease необходимо открыть пространство имен System.Runtime.Remoting.Lifetime:

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);
}

Результат выполнения примера:

Lease Configuration:
InitialLeaseTime: 00:05:00
RenewOnCallTime: 00.02.00
SponsorshipTimeout: 00.02.00
00.04.59.4191648

2) Предположим, что клиентское приложение создало пользовательский класс, реализующий ISponsor и вызывающий метод Renewal() для возврата конкретной величины времени (через тип TimeSpan). Ассоциировать указанный тип с созданным удаленным объектом можно либо с доменом приложения сервера, либо с доменом приложения клиента.

Для этого заинтересованная сторона должна получить ссылку ILease (с помощью наследуемого метода GetLifetimeService() на стороне сервера или статического метода RemotingServices.GetLifetimeService() на стороне клиента) и вызвать Register().

// Регистрация спонсора на стороне сервера
CarSponsor mySponsor = new CarSponsor();
ILease itfLeaseInfo = (ILease)this.GetLifetimeService();
itfLeaseInfo.Register(mySponsor);
// Регистрация спонсора на стороне клиента
CarSponsor mySponsor = new CarSponsor();
CarProvider cp = new CarProvider(cars);
ILease itfLeaseInfo = (ILease)Remoting.Services.GetLifetimeService(cp);
itfLeaseInfo.Register.(mySponsor);

В любом случае, если клиент или сервер желают отменить спонсорство,
это можно сделать с помощью метода ILease.Unregister(), например:

// Отключение спонсора для данного объекта
itfLeaseInfo.Unregister(mySponsor);