zoukankan      html  css  js  c++  java
  • .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

  • 相关阅读:
    2021/9/20 开始排序算法
    快速排序(自己版本)
    2021/9/17(栈实现+中后缀表达式求值)
    2021/9/18+19(中缀转后缀 + 递归 迷宫 + 八皇后)
    20212021/9/13 稀疏数组
    2021/9/12 线性表之ArrayList
    开发环境重整
    Nginx入门
    《财富的帝国》读书笔记
    Linux入门
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1809572.html
Copyright © 2011-2022 走看看