ILease-Schnittstelle

Definiert ein Lebensdauerlease-Objekt, das vom Remoting-Lebensdauerdienst verwendet wird.

Namespace: System.Runtime.Remoting.Lifetime
Assembly: mscorlib (in mscorlib.dll)

Syntax

'Declaration
<ComVisibleAttribute(True)> _
Public Interface ILease
'Usage
Dim instance As ILease
[ComVisibleAttribute(true)] 
public interface ILease
[ComVisibleAttribute(true)] 
public interface class ILease
/** @attribute ComVisibleAttribute(true) */ 
public interface ILease
ComVisibleAttribute(true) 
public interface ILease

Hinweise

Die verteilte Garbage Collection steuert, wann Serveranwendungen gelöscht werden können. Üblicherweise verwendet die verteilte Garbage Collection Verweiszähler und Ping-Signale zur Steuerung. Dies funktioniert gut, wenn nur wenige Clients pro Objekt vorhanden sind. Bei Tausenden von Clients pro Objekt reicht dies jedoch nicht aus. Der Lebensdauerdienst kann die Funktion eines herkömmlichen verteilten Garbage Collectors übernehmen, und er passt sich auch bei einer steigenden Anzahl von Clients den Leistungsanforderungen gut an.

Der Lebensdauerdienst ordnet jedem remote aktivierten Objekt einen Lease zu. Das Objekt wird gelöscht, wenn der Lease abgelaufen ist. Ein Lease kann angeben, dass ein Objekt eine unbeschränkte Lebensdauer besitzt.

Jede AppDomain enthält einen Lease-Manager, der die Leases in der Domäne verwaltet. Der Lease-Manager überprüft die Leases regelmäßig auf deren Ablauf. Wenn ein Lease abgelaufen ist, kann er entweder durch Entfernen des Verweises auf den Lease beendet werden, oder er kann durch Aufrufen mindestens eines seiner Sponsoren erneuert werden.

Ein Lease enthält Eigenschaften zum Bestimmen seiner Richtlinien und Methoden zum Erneuern der Leasezeit. Der Lease macht die ILease-Schnittstelle verfügbar.

Beispiel

Das folgende Beispiel besteht aus drei Assemblys: ein Client, ein Server und eine Bibliothek, die von Client und Server gemeinsam genutzt wird. Kompilieren Sie zuerst die Bibliothek und dann Client und Server. Mit den folgenden Befehlen kompilieren Sie die Visual Basic-Dateien. Verwenden Sie zum Kompilieren der C#-Dateien den csc-Befehl und die Dateierweiterung .cs. Die angezeigten Dateinamen sind nur Vorschläge.

 vbc /t:library ILeaseShare.vb
 vbc /r:ILeaseShare.dll ILeaseServer.vb
 vbc /r:ILeaseShare.dll /r:System.Runtime.Remoting.dll ILeaseClient.vb

Sie müssen nicht alle Visual Basic-Dateien oder alle C#-Dateien verwenden. Nach dem Kompilieren können die Assemblys unabhängig von der Quellsprache zusammenarbeiten. Öffnen Sie zum Ausführen des Beispiels zwei Befehlsfenster. Führen Sie zuerst den Server und danach den Client aus. Wenn Sie Client und Server in unterschiedlichen Ordnern platzieren, müssen Sie in jedem Ordner eine gemeinsam genutzte Bibliothek hinzufügen.

Der folgende Code wird für die gemeinsam genutzte Bibliothek verwendet.

Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Lifetime
Imports System.Security.Permissions

Namespace RemotingSamples
   Public Class HelloService
      Inherits MarshalByRefObject

      Public Function HelloMethod(name As String) As String
         Console.WriteLine("Hello " + name)
         Return "Hello " + name
      End Function 'HelloMethod

<SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags:=SecurityPermissionFlag.Infrastructure)> _
      Public Overrides Function InitializeLifetimeService() As Object
         Dim baseLease As ILease = CType(MyBase.InitializeLifetimeService(), ILease)
         If baseLease.CurrentState = LeaseState.Initial Then
            ' For demonstration the initial time is kept small.
            ' in actual scenarios it will be large.
            baseLease.InitialLeaseTime = TimeSpan.FromSeconds(15)
            baseLease.RenewOnCallTime = TimeSpan.FromSeconds(15)
            baseLease.SponsorshipTimeout = TimeSpan.FromMinutes(2)
         End If
         Return baseLease
      End Function 'InitializeLifetimeService
   End Class 'HelloService
End Namespace 'RemotingSamples
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Lifetime;
using System.Security.Permissions;

namespace RemotingSamples
{
   public class HelloService : MarshalByRefObject
   {
      public string HelloMethod(string name)
      {
         Console.WriteLine("Hello " + name);
         return "Hello " + name;
      }

[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.Infrastructure)]
      public override object InitializeLifetimeService()
      {
         ILease baseLease = (ILease)base.InitializeLifetimeService();
         if (baseLease.CurrentState == LeaseState.Initial)
         {
            // For demonstration the initial time is kept small.
            // in actual scenarios it will be large.
            baseLease.InitialLeaseTime = TimeSpan.FromSeconds(15);
            baseLease.RenewOnCallTime = TimeSpan.FromSeconds(15);
            baseLease.SponsorshipTimeout = TimeSpan.FromMinutes(2);
         }
         return baseLease;
      }
   }
}
#using <system.dll>
#using <system.runtime.remoting.dll>

using namespace System;
using namespace System::Runtime::Remoting;
using namespace System::Runtime::Remoting::Channels;
using namespace System::Runtime::Remoting::Lifetime;

namespace RemotingSamples
{
   public ref class HelloService: public MarshalByRefObject
   {
   public:
      String^ HelloMethod( String^ name )
      {
         Console::WriteLine( "Hello {0}", name );
         return "Hello {0}",name;
      }

      [System::Security::Permissions::SecurityPermissionAttribute
      (System::Security::Permissions::SecurityAction::LinkDemand, 
      Flags=System::Security::Permissions::SecurityPermissionFlag::Infrastructure)]
      virtual Object^ InitializeLifetimeService() override
      {
         ILease^ baseLease = dynamic_cast<ILease^>(MarshalByRefObject::InitializeLifetimeService());
         if ( baseLease->CurrentState == LeaseState::Initial )
         {
            
            // For demonstration the initial time is kept small.
            // in actual scenarios it will be large.
            baseLease->InitialLeaseTime = TimeSpan::FromSeconds( 15 );
            baseLease->RenewOnCallTime = TimeSpan::FromSeconds( 15 );
            baseLease->SponsorshipTimeout = TimeSpan::FromMinutes( 2 );
         }

         return baseLease;
      }

   };

}

Der folgende Code wird für die Clientassembly verwendet.

Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Tcp
Imports System.Runtime.Remoting.Lifetime

Namespace RemotingSamples


   Class HelloClient

      Shared Sub Main()
         ' Register the channel.
         Dim myChannel As New TcpChannel()
         ChannelServices.RegisterChannel(myChannel)
         RemotingConfiguration.RegisterActivatedClientType( _
                           GetType(HelloService), "Tcp://localhost:8085")

         Dim myTimeSpan As TimeSpan = TimeSpan.FromMinutes(10)

         ' Create a remote object.
         Dim myService As New HelloService()

         Dim myLease As ILease
         myLease = CType(RemotingServices.GetLifetimeService(myService), ILease)
         If myLease Is Nothing Then
            Console.WriteLine("Cannot lease.")
            Return
         End If

         Console.WriteLine("Initial lease time is " & myLease.InitialLeaseTime.ToString())
         Console.WriteLine("Current lease time is " & myLease.CurrentLeaseTime.ToString())
         Console.WriteLine("Renew on call time is " & myLease.RenewOnCallTime.ToString())
         Console.WriteLine("Sponsorship timeout is " & myLease.SponsorshipTimeout.ToString())
         Console.WriteLine("Current lease state is " & myLease.CurrentState.ToString())
         ' Register with a sponser.
         Dim mySponsor As New ClientSponsor()
         myLease.Register(mySponsor)
         Console.WriteLine("Wait for lease to expire (approx. 15 seconds)...")
         System.Threading.Thread.Sleep(myLease.CurrentLeaseTime)
         Console.WriteLine("Current lease time before renewal is " & _
                        myLease.CurrentLeaseTime.ToString())

         ' Renew the lease time.
         myLease.Renew(myTimeSpan)
         Console.WriteLine("Current lease time after renewal is " + _
                        myLease.CurrentLeaseTime.ToString())

         ' Call the Remote method.
         Console.WriteLine("Remote method output is " + myService.HelloMethod("Microsoft"))

         myLease.Unregister(mySponsor)
         GC.Collect()
         GC.WaitForPendingFinalizers()

         ' Register with lease time of 15 minutes.
         myLease.Register(mySponsor, TimeSpan.FromMinutes(15))
         Console.WriteLine("Registered client with lease time of 15 minutes.")
         Console.WriteLine("Current lease time is " + myLease.CurrentLeaseTime.ToString())

         ' Call the Remote method.
         Console.WriteLine("Remote method output is " + myService.HelloMethod("Microsoft"))
         myLease.Unregister(mySponsor)
      End Sub 'Main
   End Class 'HelloClient

End Namespace 'RemotingSamples
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Lifetime;

namespace RemotingSamples
{
   class HelloClient
   {
      static void Main()
      {
         // Register the channel.
         TcpChannel myChannel = new TcpChannel ();
         ChannelServices.RegisterChannel(myChannel);
         RemotingConfiguration.RegisterActivatedClientType(
                                typeof(HelloService),"Tcp://localhost:8085");

         TimeSpan myTimeSpan = TimeSpan.FromMinutes(10);

         // Create a remote object.
         HelloService myService = new HelloService();

         ILease myLease;
         myLease = (ILease)RemotingServices.GetLifetimeService(myService);
         if (myLease == null)
         {
            Console.WriteLine("Cannot lease.");
            return;
         }

         Console.WriteLine ("Initial lease time is " + myLease.InitialLeaseTime);
         Console.WriteLine ("Current lease time is " + myLease.CurrentLeaseTime);
         Console.WriteLine ("Renew on call time is " + myLease.RenewOnCallTime);
         Console.WriteLine ("Sponsorship timeout is " + myLease.SponsorshipTimeout);
         Console.WriteLine ("Current lease state is " + myLease.CurrentState.ToString());
         // Register with a sponser.
         ClientSponsor mySponsor = new ClientSponsor();
         myLease.Register(mySponsor);
         Console.WriteLine("Wait for lease to expire (approx. 15 seconds)...");
         System.Threading.Thread.Sleep(myLease.CurrentLeaseTime);
         Console.WriteLine ("Current lease time before renewal is " + myLease.CurrentLeaseTime);

         // Renew the lease time.
         myLease.Renew(myTimeSpan);
         Console.WriteLine ("Current lease time after renewal is " + myLease.CurrentLeaseTime);

         // Call the Remote method.
         Console.WriteLine("Remote method output is " + myService.HelloMethod("Microsoft"));

         myLease.Unregister(mySponsor);
         GC.Collect();
         GC.WaitForPendingFinalizers();

         // Register with lease time of 15 minutes.
         myLease.Register(mySponsor,TimeSpan.FromMinutes(15));
         Console.WriteLine("Registered client with lease time of 15 minutes.");
         Console.WriteLine ("Current lease time is " + myLease.CurrentLeaseTime);

         // Call the Remote method.
         Console.WriteLine("Remote method output is " + myService.HelloMethod("Microsoft"));
         myLease.Unregister(mySponsor);
      }
   }
}
#using <system.dll>
#using <system.runtime.remoting.dll>
#using <ILease_Share.dll>

using namespace System;
using namespace System::Runtime::Remoting;
using namespace System::Runtime::Remoting::Channels;
using namespace System::Runtime::Remoting::Channels::Tcp;
using namespace System::Runtime::Remoting::Lifetime;
using namespace RemotingSamples;

int main()
{
   // Register the channel.
   TcpChannel^ myChannel = gcnew TcpChannel;
   ChannelServices::RegisterChannel( myChannel );
   RemotingConfiguration::RegisterActivatedClientType( HelloService::typeid, "Tcp://localhost:8085" );
   TimeSpan myTimeSpan = TimeSpan::FromMinutes( 10 );

   // Create a remote object.
   HelloService ^ myService = gcnew HelloService;
   ILease^ myLease;
   myLease = dynamic_cast<ILease^>(RemotingServices::GetLifetimeService( myService ));
   if ( myLease == nullptr )
   {
      Console::WriteLine( "Cannot lease." );
      return  -1;
   }

   Console::WriteLine( "Initial lease time is {0}", myLease->InitialLeaseTime );
   Console::WriteLine( "Current lease time is {0}", myLease->CurrentLeaseTime );
   Console::WriteLine( "Renew on call time is {0}", myLease->RenewOnCallTime );
   Console::WriteLine( "Sponsorship timeout is {0}", myLease->SponsorshipTimeout );
   Console::WriteLine( "Current lease state is {0}", myLease->CurrentState );

   // Register with a sponser.
   ClientSponsor^ mySponsor = gcnew ClientSponsor;
   myLease->Register( mySponsor );
   Console::WriteLine( "Wait for lease to expire (approx. 15 seconds)..." );
   System::Threading::Thread::Sleep( myLease->CurrentLeaseTime );
   Console::WriteLine( "Current lease time before renewal is {0}", myLease->CurrentLeaseTime );

   // Renew the lease time.
   myLease->Renew( myTimeSpan );
   Console::WriteLine( "Current lease time after renewal is {0}", myLease->CurrentLeaseTime );

   // Call the Remote method.
   Console::WriteLine( "Remote method output is {0}", myService->HelloMethod( "Microsoft" ) );
   myLease->Unregister( mySponsor );
   GC::Collect();
   GC::WaitForPendingFinalizers();

   // Register with lease time of 15 minutes.
   myLease->Register( mySponsor, TimeSpan::FromMinutes( 15 ) );
   Console::WriteLine( "Registered client with lease time of 15 minutes." );
   Console::WriteLine( "Current lease time is {0}", myLease->CurrentLeaseTime );

   // Call the Remote method.
   Console::WriteLine( "Remote method output is {0}", myService->HelloMethod( "Microsoft" ) );
   myLease->Unregister( mySponsor );
}

Der folgende Code wird für die Serverassembly verwendet.

Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Tcp
Imports System.Runtime.Remoting.Lifetime

Namespace RemotingSamples
   Class HelloServer

      Shared Sub Main()
         Dim myChannel As New TcpChannel(8085)
         ChannelServices.RegisterChannel(myChannel)
         RemotingConfiguration.RegisterActivatedServiceType(GetType(HelloService))
         Console.WriteLine("Server started.")
         Console.WriteLine("Hit enter to terminate...")
         Console.Read()
      End Sub 'Main
   End Class 'HelloServer
End Namespace 'RemotingSamples
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Lifetime;


namespace RemotingSamples
{
   class HelloServer
   {
      static void Main()
      {
         TcpChannel myChannel = new TcpChannel (8085);
         ChannelServices.RegisterChannel(myChannel);
         RemotingConfiguration.RegisterActivatedServiceType(typeof(HelloService));
         Console.WriteLine("Server started.");
         Console.WriteLine("Hit enter to terminate...");
         Console.Read();
      }
   }
}
#using <system.dll>
#using <system.runtime.remoting.dll>
#using <ILease_Share.dll>

using namespace System;
using namespace System::Runtime::Remoting;
using namespace System::Runtime::Remoting::Channels;
using namespace System::Runtime::Remoting::Channels::Tcp;
using namespace System::Runtime::Remoting::Lifetime;
using namespace RemotingSamples;

int main()
{
   TcpChannel^ myChannel = gcnew TcpChannel( 8085 );
   ChannelServices::RegisterChannel( myChannel );
   RemotingConfiguration::RegisterActivatedServiceType( HelloService::typeid );
   Console::WriteLine( "Server started." );
   Console::WriteLine( "Hit enter to terminate..." );
   Console::Read();
}

Plattformen

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

Siehe auch

Referenz

ILease-Member
System.Runtime.Remoting.Lifetime-Namespace