本文主要是介绍转:Remoting系列(三)----对象的生命周期管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Remoting系列(三)----对象的生命周期管理
对于服务器对象不保留任何状态的SingleCall对象是不需要有对象租用的。只有需要保留状态的对象,无论是服务器激活的Singleton 还是客户端激活的对象才需要对象租用。
NET Remoting 为管理远程对象的生存期提供了功能强大的机制。如果我们的服务器对象不保留任何状态(如 SingleCall 对象),那么不必关注此进程,只需让 Remoting 基础结构完成要完成的工作即可,需要时,对象将作为垃圾被回收。如果我们保留状态,无论是服务器激活的 Singleton 还是客户端激活的对象,我们可能都要参与生存期管理进程:对象租用。
下面是NET Remoting 为管理远程对象的生存期管理的架构:
和其他技术不同,.Net Remoting采用了租用来管理对象。对象不是自己创建的,而是租用的。开始先租用此对象,当此对象租期结束后,可以提出续租来继续维持此对象。Remoting 基于租用对象的生存期管理利用了租用、负责人和租用管理器。每个应用程序域都包含一个租用管理器,它将每个Singleton 或客户端激活的对象的租用对象引用保存在其域中。每个租用可以有零个或多个相关的负责人,负责人能够在租用管理器确定租用过期时重新租用。这一机制是通过 ILease 接口提供的,ILease 接口定义了很多用于管理对象生存期的属性:
- InitialLeaseTime。确定租用最初的有效期。
- RenewOnCallTime。在每个方法调用后,更新此时间单元的租用。
- SponsorshipTimeout。负责人通知租用过期后,Remoting 要等待的时间。
- CurrentLeaseTime。距租用到期的时间(只读)。
租用过期后,租用管理器将通知所有租用负责人,询问他们是否要更新租用。如果不更新,将释放相关的对象引用。负责人是可以为远程对象更新租用的对象。要成为负责人,您的类必须从 MarshalByRefObject 中导出并实现 ISponsor 接口。一个租用可以有多个负责人,一个负责人也可以参与多个租用。
如果租约已经过期,客户端还调用对象上的方法,就会出现异常。如果客户端要继续使用租用对象,那么就需要续约。续约的方法有3种:
1)隐式续约:当客户调用远程对象上的方法时,租约的隐式续借会自动进行。
2)显示续约:通过ILease接口的Renew()方法完成。通过调用透明代理对象的GetLifeService()方法,就可以使用ILease接口。
3)发起租约:客户可以创建一个实现ISponsor接口的发起者,并使用ILease接口的Register()方法在租约服务中注册这个发起者。发起者定义租约延长的时间。当租约到期时,发起者就要求延长租约时间。如果长期租约服务器上的远程对象,可以使用这个发起租约机制。
下面的代码显示了默认的租约信息,配置文件和服务器端代码如同<<Remoting系列(二)>>.
客户端代码如下:
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Runtime.Remoting;
5using System.Runtime.Remoting.Channels;
6using System.Runtime.Remoting.Channels.Tcp;
7using System.IO;
8
9using System.Runtime.Remoting.Lifetime;
10
11namespace RemotingDemo
12{
13 /**//// <summary>
14 /// 客户端
15 /// </summary>
16 public class Client
17 {
18 static void Main(string[] args)
19 {
20 RemotingConfiguration.Configure(@"client.exe.config", true);
21 RemoteObject obj = new RemoteObject();
22 if (obj == null)
23 {
24 Console.WriteLine("Could not get Tcp Server");
25 }
26
27 //调用远程方法
28 Console.WriteLine("Client TCP GetClassName: {0}",obj.GetClassName("ring1981"));
29
30 ILease lease = (ILease)obj.GetLifetimeService();
31 if (lease != null)
32 {
33 Console.WriteLine("Lease Configuration:");
34 Console.WriteLine("InitialLeaseTime: " +
35 lease.InitialLeaseTime);
36 Console.WriteLine("RenewOnCallTime: " +
37 lease.RenewOnCallTime);
38 Console.WriteLine("SponsorshipTimeout: " +
39 lease.SponsorshipTimeout);
40 Console.WriteLine(lease.CurrentLeaseTime);
41 }
42 Console.ReadLine();
43 }
44 }
45}
运行工程,显示结果如下:
http://www.cnblogs.com/Ring1981/archive/2006/07/23/457449.html
转
这篇关于转:Remoting系列(三)----对象的生命周期管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!