Compartir a través de


Inicializar concesiones

Las instancias MarshalByRefObject (MBR) pueden crear sus propios términos de concesión o se pueden configurar para que utilicen las propiedades especificadas en el elemento <lifetime> de un archivo de configuración de un equipo o aplicación. Las propiedades de la duración se pueden establecer únicamente cuando la concesión se encuentra en su estado inicial, es decir, cuando una llamada a InitializeLifetimeService la crea; las llamadas posteriores no tendrán ningún efecto.

Reemplazar InitializeLifetimeService

Cuando se llama al método ILease lease = (ILease)base.InitializeLifetimeService(); en un método InitializeLifetimeService reemplazado, se devuelve una concesión existente para el objeto o, si no existe ninguna, se devuelve una concesión nueva. Sólo se pueden establecer las propiedades de la concesión si se devuelve una nueva; tiene que asegurarse de que el estado es LeaseState.Initial o se iniciará una excepción.

La única llamada que afecta al servicio de duración es la llamada a InitializeLifetimeService desde la infraestructura de .NET remoting, que activa la concesión. Otro código puede llamar a InitializeLifetimeService y crear una concesión, pero dicha concesión permanecerá en su estado inicial hasta que sea devuelta a la infraestructura de .NET remoting. Una concesión existente que no esté en el estado inicial, no se puede establecer con valores nuevos, si bien el nuevo receptor puede devolverla a la infraestructura para que varios receptores de un objeto puedan apuntar a la misma concesión.

Si el tiempo de la concesión es 0 (cero) o se devuelve una concesión con el valor null, no se crea ninguna concesión. Si RenewOnCallTime es 0 (cero), no se crea ningún receptor pero sí se crea una concesión. En el ejemplo de código siguiente se demuestra una sustitución estándar.

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

La implementación de InitializeLifetimeService suele llamar al método correspondiente de la clase base con el fin de recuperar la concesión existente para el objeto remoto. Si las referencias al objeto no se han calculado nunca, la concesión devuelta está en su estado inicial y se pueden configurar sus propiedades. Una vez calculadas las referencias al objeto, la concesión pasa del estado inicial al estado activo y se pasará por alto cualquier intento de inicializar sus propiedades (se iniciará una excepción). Cuando se activa el objeto remoto, se llama a InitializeLifetimeService. Con la llamada de activación se puede suministrar una lista de patrocinadores de la concesión y se pueden agregar más en cualquier momento mientras la concesión esté activa.

Vea también

Renovar concesiones | Ejemplo de interacción remota: Períodos de duración | Concesiones del período de duración