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系列(二)>>.
客户端代码如下:
1
using System;2
using System.Collections.Generic;3
using System.Text;4
using System.Runtime.Remoting;5
using System.Runtime.Remoting.Channels;6
using System.Runtime.Remoting.Channels.Tcp;7
using System.IO;8

9
using System.Runtime.Remoting.Lifetime;10

11
namespace RemotingDemo12


{13

/**//// <summary>14
/// 客户端15
/// </summary>16
public class Client17

{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
转
127

被折叠的 条评论
为什么被折叠?



