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

  • 相关阅读:
    Develop an Android Application
    有效提高编程技能
    如何提高团队编程水平
    ruby测试框架
    grep:Binary file (standard input) matches
    python datetime相减
    软件开发的“三重门
    Linux高手之路SVN使用笔记
    机器io高原因排查全命令指南
    代码如写作
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1809572.html
Copyright © 2011-2022 走看看