.NET Remoting Basic(3)-生存期租约
2010-08-26 22:44 Clingingboy 阅读(593) 评论(0) 编辑 收藏 举报用于管理远程对象的生命周期
1.初始化租约
使用LifetimeServices对象初始化
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(); }
一旦设置,将无法更改
重写 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(); }
将显示对象过期,抛出错误信息.
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); //略 }
测试结果,对象可以照常使用