Inizializzazione dei lease

Le istanze di MarshalByRefObject (MBR) possono creare i propri termini di lease o essere configurate per utilizzare le proprietà di lease specificate nell'elemento <lifetime> di un file di configurazione del computer o dell'applicazione. L'impostazione delle proprietà di durata funziona solo quando un lease si trova nello stato iniziale, ossia quando viene creato da InitializeLifetimeService, mentre le chiamate successive non avranno alcun effetto.

Override di InitializeLifetimeService

Quando si chiama il metodo ILease lease = (ILease)base.InitializeLifetimeService(); in un InitializeLifetimeService sottoposto a override, verrà restituito un lease esistente per l'oggetto o, nel caso in cui non sia presente alcun lease, ne verrà restituito uno nuovo. Le proprietà di lease possono essere impostate solo se viene restituito un nuovo lease, pertanto è necessario assicurarsi che lo stato sia LeaseState.Initial o verrà generata un'eccezione.

L'unica chiamata che influisce sul servizio di durata è quella a InitializeLifetimeService dall'infrastruttura di .NET Remoting, che consente di attivare il lease. Con altro codice è possibile chiamare InitializeLifetimeService e creare un lease, ma quest'ultimo rimarrà nello stato iniziale finché non verrà restituito all'infrastruttura di .NET Remoting. Non è possibile impostare nuovi valori per un lease esistente che non sia nello stato iniziale, sebbene il lease possa essere restituito all'infrastruttura dal nuovo sink per consentire a più sink relativi a un oggetto di puntare allo stesso lease.

Non viene creato alcun lease se il tempo di lease è pari a 0 (zero) o se viene restituito un lease null. Se RenewOnCallTime è pari a 0 (zero), non verrà creato un sink ma un lease. Nell'esempio di codice riportato di seguito viene mostrato un override standard.

Public Class MyLifetimeControlObject
   Inherits MarshalByRefObject
   
   Public Overrides Function InitializeLifetimeService() As [Object]
      Dim lease As ILease = CType(MyBase.InitializeLifetimeService(), ILease)
      If lease.CurrentState = LeaseState.Initial Then
         lease.InitialLeaseTime = TimeSpan.FromMinutes(1)
         lease.SponsorshipTimeout = TimeSpan.FromMinutes(2)
         lease.RenewOnCallTime = TimeSpan.FromSeconds(2)
      End If
      Return lease
   End Function 'InitializeLifetimeService
End Class 'MyLifetimeControlObject
[C#]
public class MyLifetimeControlObject: MarshalByRefObject {
   public override Object InitializeLifetimeService()
   {
      ILease lease = (ILease)base.InitializeLifetimeService();
      if (lease.CurrentState == LeaseState.Initial)  {
         lease.InitialLeaseTime = TimeSpan.FromMinutes(1);
         lease.SponsorshipTimeout = TimeSpan.FromMinutes(2);
         lease.RenewOnCallTime = TimeSpan.FromSeconds(2);
      }
      return lease;
   }
}

Nell'implementazione di InitializeLifetimeService viene in genere chiamato il metodo corrispondente della classe base per il recupero del lease esistente per l'oggetto remoto. Se il marshalling dell'oggetto non è mai stato eseguito prima, il lease restituito si trova nello stato iniziale ed è possibile impostare le proprietà di lease. Dopo il marshalling dell'oggetto, il lease passa dallo stato iniziale a quello attivo, qualsiasi tentativo di inizializzazione delle proprietà di lease verrà ignorato e verrà generata un'eccezione. InitializeLifetimeService viene chiamato quando si attiva l'oggetto remoto. Con la chiamata di attivazione può essere fornito un elenco di sponsor per il lease e, quando il lease è attivo è possibile aggiungere più sponsor in qualsiasi momento.

Vedere anche

Rinnovo dei lease | Esempio di comunicazione remota: durata | Lease di durata