• .NET Remoting Basic(3)生存期租约


        用于管理远程对象的生命周期

    1.初始化租约

    使用LifetimeServices对象初始化

    image_2

    static void Main(string[] args)
     {
         Console.WriteLine ("ServerStartup.Main(): Server started");
     
         LifetimeServices.LeaseManagerPollTime = TimeSpan.FromMilliseconds(10);
     
         HttpChannel chnl = new HttpChannel(1234);
         ChannelServices.RegisterChannel(chnl);
     
         RemotingConfiguration.RegisterWellKnownServiceType(
             typeof(MyRemoteFactory),
             "factory.soap",
             WellKnownObjectMode.Singleton);
     
         // the server will keep running until keypress.
         Console.ReadLine();
     }


    2.自定义租约

    一旦设置,将无法更改

    重写 MarshalByRefObject.InitializeLifetimeService()

    public override object InitializeLifetimeService() 
     {
         Console.WriteLine("MyRemoteObject.InitializeLifetimeService() called");
         ILease lease = (ILease)base.InitializeLifetimeService();
         if (lease.CurrentState == LeaseState.Initial)  
         {
             lease.InitialLeaseTime = TimeSpan.FromMilliseconds(10);
             lease.SponsorshipTimeout = TimeSpan.FromMilliseconds(10);
             lease.RenewOnCallTime = TimeSpan.FromMilliseconds(10);
         }
         return lease;
     }


    3.客户端测试

    static void Main(string[] args)
     {
         HttpChannel channel = new HttpChannel();
         ChannelServices.RegisterChannel(channel);
     
               Console.WriteLine("Acqu. Rem. Instance");
                     IRemoteFactory fact = (IRemoteFactory) Activator.GetObject(
                 typeof(IRemoteFactory),
                 "http://localhost:1234/factory.soap");
         
         Console.WriteLine("Client.Main(): Acquiring object from factory");
         IRemoteObject obj1 = fact.getNewInstance();
     
         Console.WriteLine("Client.Main(): Sleeping one second");
         
         System.Threading.Thread.Sleep(1000);
     
         Console.WriteLine("Client.Main(): Setting value");
         try 
         {
           obj1.setValue(42);
         } 
         catch (Exception e) 
         {
             Console.WriteLine("Client.Main(). EXCEPTION \n{0}",e.Message);
         }
     
         Console.ReadLine();
     }

    测试结果

    将显示对象过期,抛出错误信息.

    image_4

    4.续订租约

    static void Main(string[] args)
     {
     //同上,略  
    IRemoteObject obj1 = fact.getNewInstance(); ((obj1 as MarshalByRefObject).GetLifetimeService() as ILease).Renew(TimeSpan.FromSeconds(1000)); Console.WriteLine("Client.Main(): Sleeping one second"); System.Threading.Thread.Sleep(1000); //略 }

    测试结果,对象可以照常使用

    image_6

  • 相关阅读:
    VC++中使用内存映射文件处理大文件
    802.1x协议解析
    Jscript中window.setInterval和window.setTimeout区别
    在C#中使用代理的方式触发事件
    JavaScript实用的一些技巧
    控制C#编的程序内存的占用
    纯C#钩子实现及应用(转)
    DES的建立过程
    C# 显示占用内存
    解决“由于应用程序的配置不正确,应用程序未能启动,重新安装应用程序可能会纠正这个问题”
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1809572.html
Copyright © 2020-2023  润新知