Remoting系列(三)----对象的生命周期管理
首先,需要讲明一点:
对于服务器对象不保留任何状态的SingleCall对象是不需要有对象租用的。只有需要保留状态的对象,无论是服务器激活的Singleton 还是客户端激活的对象才需要对象租用。
NET Remoting 为管理远程对象的生存期提供了功能强大的机制。如果我们的服务器对象不保留任何状态(如 SingleCall 对象),那么不必关注此进程,只需让 Remoting 基础结构完成要完成的工作即可,需要时,对象将作为垃圾被回收。如果我们保留状态,无论是服务器激活的 Singleton 还是客户端激活的对象,我们可能都要参与生存期管理进程:对象租用。
下面是NET Remoting 为管理远程对象的生存期管理的架构:

和其他技术不同,.Net Remoting采用了租用来管理对象。对象不是自己创建的,而是租用的。开始先租用此对象,当此对象租期结束后,可以提出续租来继续维持此对象。Remoting 基于租用对象的生存期管理利用了租用、负责人和租用管理器。每个应用程序域都包含一个租用管理器,它将每个Singleton 或客户端激活的对象的租用对象引用保存在其域中。每个租用可以有零个或多个相关的负责人,负责人能够在租用管理器确定租用过期时重新租用。这一机制是通过 ILease 接口提供的,ILease 接口定义了很多用于管理对象生存期的属性:
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 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
}
转
对于服务器对象不保留任何状态的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

2

3

4

5

6

7

8

9

10

11

12



13


14

15

16

17



18

19



20

21

22

23



24

25

26

27

28

29

30

31

32



33

34

35

36

37

38

39

40

41

42

43

44

45

运行工程,显示结果如下:
http://www.cnblogs.com/Ring1981/archive/2006/07/23/457449.html
转