Lease di durata

Gli oggetti con marshalling per riferimento (MBR, Marshal-by-Reference) non rimangono memorizzati per sempre, sia che si tratti di oggetti Singleton attivati da server o di oggetti attivati da client. Al contrario, a meno che il tipo non esegua l'override di MarshalByRefObject.InitializeLifetimeService per controllare i criteri di durata, ogni MBR presenta una durata controllata da una combinazione di lease, un gestore di lease e alcuni sponsor. In tal caso la durata di un oggetto MBR corrisponde al tempo totale durante il quale l'oggetto rimane attivo in memoria. Un lease è il periodo di tempo in cui un determinato oggetto rimarrà in memoria prima che dal sistema .NET Remoting vengano avviati il processo di eliminazione dell'oggetto stesso e il recupero della memoria. Il gestore di lease del dominio applicazione server è l'oggetto che determina quando l'oggetto remoto è contrassegnato per la procedura di Garbage Collection. Uno sponsor è un oggetto che può richiedere un nuovo lease per un determinato oggetto mediante la propria registrazione con il gestore di lease.

Ogni volta che un oggetto MBR passa in modalità remota all'esterno di un dominio applicazione, viene creato un lease di durata per tale oggetto. In ogni dominio applicazione è presente un gestore di lease responsabile dell'amministrazione dei lease nel proprio dominio, il quale esamina periodicamente tutti i lease per controllarne la scadenza. Se un lease è scaduto, viene effettuata dal gestore una ricerca nell'elenco di sponsor per tale oggetto al fine di verificare se è richiesto il rinnovo del lease. Se non viene rinnovato da alcuno sponsor, il lease viene rimosso dal relativo gestore, l'oggetto viene eliminato e la memoria viene recuperata mediante la procedura di Garbage Collection. La durata di un oggetto può quindi essere superiore al lease di durata, se rinnovata più volte da uno sponsor o chiamata continuamente da parte dei client.

Poiché la durata di un oggetto remoto è indipendente da quella dei relativi client, il lease per un oggetto semplice o leggero può essere molto lungo, può essere utilizzato da alcuni client e periodicamente rinnovato da un amministratore o da un client. In questo approccio i lease vengono utilizzati in modo efficiente in quanto il traffico di rete necessario per la procedura distribuita di Garbage Collection è limitato. Tuttavia, gli oggetti remoti che impiegano poche risorse possono presentare un lease di breve durata che il client rinnova frequentemente. Al termine delle operazioni dei client sull'oggetto remoto, quest'ultimo viene rapidamente eliminato dal sistema .NET Remoting. Con questo criterio un maggiore traffico di rete viene sostituito da un uso più efficiente delle risorse del server.

L'utilizzo dei lease per gestire la durata di oggetti remoti è un approccio alternativo al conteggio dei riferimenti, che può essere complesso e inefficiente su connessioni di rete non affidabili. Sebbene sia possibile configurare i lease per estendere la durata di un oggetto remoto più a lungo del necessario, il lease rappresenta una soluzione vantaggiosa per ridurre il traffico di rete relativo al conteggio dei riferimenti e al ping sui client, se configurato in modo appropriato allo scenario di impiego.

Nella tabella che segue vengono descritte le cinque proprietà principali dei lease.

Proprietà Descrizione
InitialLeaseTime Specifica il periodo di tempo iniziale durante il quale un oggetto rimane memorizzato prima che il processo di eliminazione venga avviato dal gestore di lease. Nel file di configurazione, si tratta dell'attributo leaseTime dell'elemento di configurazione <lifetime>. Il valore predefinito è 5 minuti. Con un valore pari a zero, il lease viene impostato su una durata infinita.
CurrentLeaseTime Specifica il tempo rimasto prima della scadenza del lease. Quando un lease viene rinnovato, la proprietà CurrentLeaseTime è impostata sul valore massimo di CurrentLeaseTime o RenewOnCallTime.
RenewOnCallTime Specifica la durata massima impostata per CurrentLeaseTime dopo ogni chiamata remota all'oggetto. Il valore predefinito è 2 minuti.
SponsorshipTimeout Specifica l'intervallo di attesa del gestore di lease per la risposta dello sponsor quando viene notificato che un lease è scaduto. Se non risponde nel tempo specificato, lo sponsor viene rimosso e ne viene chiamato un altro. Se non esistono altri sponsor, il lease scade e l'oggetto remoto viene eliminato da Garbage Collector. Se il valore è pari a 0 (TimeSpan.Zero), gli sponsor non verranno registrati dal lease. Il valore predefinito è 2 minuti.
LeaseManagerPollTime Specifica l'intervallo di tempo di inattività del gestore di lease dopo il controllo dei lease scaduti. Il valore predefinito è 10 secondi.

I lease sono creati quando un oggetto MBR viene attivato in un altro dominio applicazione. A quel punto, quando la proprietà ILease.CurrentState è LeaseState.Initial, sarà possibile impostare le proprietà del lease. Una volta impostate, le proprietà non possono essere modificate direttamente. È possibile modificare solo CurrentLeaseTime da una chiamata a ILease.Renew o quando ISponsor.Renewal viene chiamato dal gestore di lease su uno sponsor e da quest'ultimo viene inviata una risposta mediante un oggetto TimeSpan. MarshalByRefObject ha l'implementazione predefinita di un lease di durata e, a meno che non si modifichi questo lease alla creazione, le proprietà di lease sono sempre uguali.

Modifica delle proprietà di lease

Le proprietà del lease di durata possono essere modificate in due modi:

  • Dichiarando le proprietà di lease di durata personalizzate mediante l'override di MarshalByRefObject.InitializeLifetimeService nell'oggetto MBR per impostare le proprietà sul lease stesso o per restituire un riferimento null (Nothing in Visual Basic). Con la suddetta operazione si comunica al sistema .NET Remoting che le istanze di questo tipo sono destinate a una durata infinita.
  • Il programmatore o l'amministratore può anche specificare proprietà di durata per tutti gli oggetti di una determinata applicazione nell'elemento <lifetime> contenuto nel file di configurazione del computer o dell'applicazione. Per informazioni dettagliate, vedere Inizializzazione dei lease.

Una volta creato, un lease può essere rinnovato in tre modi.

  • Un client chiama il metodo ILease.Renew direttamente.
  • Se si imposta la proprietà ILease.RenewOnCallTime, ogni chiamata all'oggetto remoto rinnova il lease per il tempo specificato.
  • Il lease chiama un metodo ISponsor.Renewal per richiedere un rinnovo e lo sponsor risponde con un TimeSpan.

Per informazioni dettagliate, vedere Rinnovo dei lease.

Gestori di lease

La scadenza dei lease viene esaminata periodicamente mediante i gestori di lease. Alla scadenza, il lease viene informato e richiama gli sponsor per tentare di rinnovarsi.

Il gestore di lease mantiene inoltre un elenco di sponsor dai quali i lease attendono risposte. Se uno sponsor non risponde nell'intervallo specificato da SponsorshipTimeOut, viene rimosso dall'elenco.

Quando si concede la scadenza di un lease, non sono ammessi ulteriori messaggi di lease o restituzioni di sponsor. Il riferimento al lease viene rimosso dall'elenco e il riferimento all'oggetto viene rimosso dalla tabella interna del sistema .NET Remoting. Il lease e l'oggetto vengono quindi rimossi dal sistema di Garbage Collection.

Vedere anche

Attivazione e durata degli oggetti | Esempio di comunicazione remota: durata | Schema delle impostazioni remote | ILease | RemotingServices.GetLifetimeService | MarshalByRefObject.InitializeLifetimeService | Inizializzazione dei lease | Rinnovo dei lease