Freigeben über


Lebensdauer-Leases

MBR (Marshal-by-Reference)-Objekte befinden sich nicht unbegrenzt lange im Speicher. Dabei wird kein Unterschied zwischen serveraktivierten Singleton-Objekten und clientaktivierten Objekten gemacht. Stattdessen hat jedes MBR-Objekt eine Lebensdauer, die von der Kombination aus Leases, einem Lease-Manager und einigen Sponsoren gesteuert wird, es sei denn, der Typ überschreibt MarshalByRefObject.InitializeLifetimeService, um die eigenen Lebensdauerrichtlinien zu steuern. (In diesem Fall ist die Lebensdauer eines MBR-Objekts die gesamte Zeit, die das Objekt im Speicher aktiv bleibt.) Bei einem Lease handelt es sich um den Zeitraum, in dem ein bestimmtes Objekt im Speicher aktiv ist, bevor das .NET Remoting-System mit dem Löschen des Objekts beginnt und den Speicher neu zur Verfügung stellt. Der Lease-Manager der Serveranwendungsdomäne ist das Objekt, mit dem der Zeitpunkt festgelegt wird, zu dem das Remoteobjekt für die Garbage Collection gekennzeichnet werden soll. Ein Sponsor ist ein Objekt, das einen neuen Lease für ein bestimmte Objekt anfordern kann, indem es sich selbst bei dem Lease-Manager registriert.

Ein Lebensdauer-Lease wird immer dann für ein MBR-Objekt erstellt, wenn es außerhalb einer Anwendungsdomäne verschoben wird. Jede Anwendungsdomäne enthält einen Lease-Manager, der für die Verwaltung der Leases in seiner Domäne zuständig ist. Der Lease-Manager untersucht alle Leases regelmäßig auf abgelaufene Leasezeiten. Wenn ein Lease abgelaufen ist, führt der Lease-Manager einen Durchlauf durch die Liste der Sponsoren für das Objekt aus und fragt an, ob der Lease erneuert werden soll. Wenn kein Sponsor den Lease erneuern möchte, entfernt der Lease-Manager den Lease, das Objekt wird gelöscht, und der entsprechende Speicher wird von der Garbage Collection freigegeben. Die Lebensdauer eines Objekts kann dann viel länger sein als seine Lebensdauer-Lease, wenn sie mehr als einmal von einem Sponsor erneuert bzw. ständig von Clients aufgerufen wird.

Da die Lebensdauer des Remoteobjekts unabhängig von der Lebensdauer seiner Clients ist, kann der Lease für ein einfaches oder kompaktes Objekt sehr lang sein, von zahlreichen Clients verwendet werden und regelmäßig durch einen Administrator oder Client erneuert werden. Bei diesem Ansatz werden Leases effizient eingesetzt, da für die verteilte Garbage Collection nur wenig Netzwerkverkehr erforderlich ist. Remoteobjekte, die knappe Ressourcen beanspruchen, können jedoch über einen Lease mit einer kurzen Lebensdauer verfügen, die vom Client regelmäßig mit kurzer Zeitspanne erneuert wird. Wenn alle Clients die Arbeit mit dem Remoteobjekt abgeschlossen haben, wird das Objekt vom .NET Remoting-System umgehend gelöscht. Dank dieser Richtlinie tritt eine effizientere Nutzung der Serverressourcen an die Stelle erhöhten Netzwerkverkehrs.

Die Verwendung von Leases zur Verwaltung der Lebensdauer von Remoteobjekten stellt eine Alternative zur Verweiszählung dar, die kompliziert und bei unzuverlässigen Netzwerkverbindungen ineffizient sein kann. Obwohl Leases so konfiguriert werden können, dass die Lebensdauer eines Remoteobjekts länger als notwendig verlängert wird, stellt das Leasing durch die Reduzierung des Netzwerkverkehrs gegenüber der Verweiszählung und des Sendens eines Ping-Signals an Clients eine interessante Lösung dar, wenn eine dem Szenario entsprechende Konfiguration vorgenommen wurde.

In der folgenden Tabelle werden die fünf Haupteigenschaften von Leases beschrieben.

Eigenschaft Beschreibung
InitialLeaseTime Gibt die ursprüngliche Zeit an, die ein Objekt im Speicher verbleibt, bevor der Lease-Manager das Objekt löscht. In der Konfigurationsdatei handelt es sich hierbei um das leaseTime-Attribut des <lifetime>-Konfigurationselements. Der Standardwert beträgt 5 Minuten. Eine Leasezeit von 0 bedeutet, dass der Lease eine unbegrenzte Lebensdauer hat.
CurrentLeaseTime Gibt die verbleibende Zeit bis zum Ablauf des Lease an. Bei der Erneuerung eines Lease wird die CurrentLeaseTime auf das Maximum der CurrentLeaseTime oder der RenewOnCallTime gesetzt.
RenewOnCallTime Gibt die maximale Zeitspanne an, auf die CurrentLeaseTime nach jedem Remoteaufruf des Objekts festgelegt wird. Der Standardwert beträgt 2 Minuten.
SponsorshipTimeout Gibt die Zeit an, die der Lease-Manager bei Benachrichtigung über den Ablauf des Lease auf die Antwort des Sponsors wartet. Wenn der Sponsor nicht in der angegebenen Zeit antwortet, wird er entfernt, und ein anderer Sponsor wird aufgerufen. Wenn keine Sponsoren mehr vorhanden sind, läuft der Lease ab, und der Garbage Collector entfernt das Remoteobjekt. Beim Wert "0" (TimeSpan.Zero) werden vom Lease keine Sponsoren registriert. Der Standardwert beträgt 2 Minuten.
LeaseManagerPollTime Gibt an, wie lange sich der Lease-Manager nach der Überprüfung auf abgelaufene Leases im Ruhezustand befindet. Der Standardwert beträgt 10 Sekunden.

Leases werden erstellt, wenn ein MBR-Objekt in einer anderen Anwendungsdomäne aktiviert wird. Dann können, wenn die ILease.CurrentState-Eigenschaft LeaseState.Initial ist, die Eigenschaften des Lease festgelegt werden. Sobald diese gesetzt sind, können sie nicht mehr direkt geändert werden. Geändert werden kann dann lediglich die CurrentLeaseTime-Eigenschaft, und zwar entweder über einen ILease.Renew-Aufruf oder wenn der Lease-Manager ISponsor.Renewal für einen Sponsor aufruft, und der Sponsor mit einem TimeSpan-Objekt antwortet. MarshalByRefObject hat die Standardimplementierung eines Lebensdauer-Lease, und die Leaseeigenschaften sind immer dieselben, es sei denn, dieser Lease wird bei Erstellung geändert.

Ändern von Leaseeigenschaften

Es gibt zwei verschiedene Möglichkeiten zum Ändern der Leaseeigenschaften:

  • Deklarieren benutzerdefinierter Eigenschaften von Lebensdauer-Leases durch Überschreiben von MarshalByRefObject.InitializeLifetimeService im MBR-Objekt, um entweder selbst Eigenschaften für den Lease festzulegen oder einen NULL-Verweis (Nothing in Visual Basic) zurückzugeben. Mit letzterer Option wird das .NET Remoting-System darüber benachrichtigt, dass Instanzen dieses Typs über eine unbeschränkte Lebensdauer verfügen sollen.
  • Sie oder ein Administrator können auch Lebensdauereigenschaften für alle Objekte in einer bestimmten Anwendung im <lifetime>-Element in der Anwendung bzw. in der Konfigurationsdatei des Computers festlegen. Einzelheiten finden Sie unter Initialisieren von Leases.

Es gibt drei verschiedene Möglichkeiten zum Erneuern eines Lease, nachdem dieser erstellt wurde:

  • Ein Client ruft die ILease.Renew-Methode direkt auf.
  • Wenn die ILease.RenewOnCallTime-Eigenschaft gesetzt ist, erneut jeder Aufruf des Remoteobjekts den Lease um die angegebene Zeit.
  • Der Lease ruft eine ISponsor.Renewal-Methode auf und fordert eine Leaseerneuerung an, und der Sponsor antwortet mit einer TimeSpan.

Einzelheiten finden Sie unter Erneuern von Leases.

Lease-Manager

Lease-Manager müssen Leases regelmäßig auf den Ablauf der Lebensdauer überprüfen. Wenn eine Leasezeit abgelaufen ist, wird der Lease darüber in Kenntnis gesetzt, und er versucht, sich selbst durch Aufrufen seiner Sponsoren zu erneuern.

Der Lease-Manager verwaltet auch eine Liste mit Sponsoren, von denen Leases auf Antworten warten. Antwortet ein Sponsor nicht in der in der SponsorshipTimeOut-Zeit angegebenen Zeit, wird er aus der Sponsorenliste entfernt.

Wenn der Ablauf eines Lease zulässig ist, werden keine weiteren Leasemeldungen oder Sponsorrückmeldungen mehr akzeptiert. Der Verweis für den Lease wird aus der Leaseliste entfernt, und das .NET Remoting-System entfernt den Objektverweis aus der internen Tabelle. Das Garbage Collection-System entfernt dann den Lease und das Objekt.

Siehe auch

Aktivierung und Lebensdauer von Objekten | Remotingbeispiel: Lebensdauer | Schema für Remoteeinstellungen | ILease | RemotingServices.GetLifetimeService | MarshalByRefObject.InitializeLifetimeService | Initialisieren von Leases | Erneuern von Leases