100165477.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 182 行 · 第 1/2 页
HTM
182 行
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
16.5.7 生存期管理
</title></head>
<body>
<div class="area">
<div class="col1">
<div class="lineBlue">
</div>
<!-- title -->
<div class="arcTitle">
<h1>
<a href="../16">
C#高级编程(第3版)【全文连载】
</a>
</h1>
<div style="text-align: center; font-size: 15px">
<a href="100165477.htm">
16.5.7 生存期管理
</a>
</div>
<div style="text-align: center; font-size: 15px">
<a class="url" href="../../default.htm">http://book.csdn.net/</a>
2006-10-13 14:41:00
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165477.htm'><font color='red'>16.5.7 生存期管理</font></a></h1>
<div id="divRelateNode" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165474.htm'>16.5.4 对象的激活</a></div><div style='float:right;width:49%'>·<a href='100165475.htm'>16.5.5 消息接收器</a></div><div style='float:left;width:49%'>·<a href='100165476.htm'>16.5.6 在远程方法中传递对象</a></div><div style='float:right;width:49%'>·<a href='100165478.htm'>16.6 .NET Remoting的其他特性</a></div><div style='float:left;width:49%'>·<a href='100165479.htm'>16.6.1 配置文件(1)</a></div><div style='float:right;width:49%'>·<a href='100165480.htm'>16.6.1 配置文件(2)</a></div></div>
</div>
</div>
</div>
<!-- main -->
<div id="main">
<div id="text"> <link href="css.css" rel="stylesheet" type="text/css" /><h3 style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 0cm; MARGIN-RIGHT: 0cm; FTEL: 8.15pt"><a ftel="_Toc507815561"><span lang="EN-US">16.5.7 </span></a><span style="FONT-FAMILY: 黑体">生存期管理</span></h3>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">客户机和服务器怎样检测到另一端是否可用?此时,我们遇到的问题是什么呢?</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">对于客户机而言,答案是比较简单的。只要客户机调用远程对象上的方法,就会产生</span><span lang="EN-US">System.Runtime.Remoting.RemotingException</span><span style="FONT-FAMILY: 宋体">类型的异常。此时,只需处理这个异常,完成一些必要的工作,如重试、编写日志以及通知用户等。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 16pt"><span style="FONT-FAMILY: 宋体">对于服务器而言,服务器应何时检测客户机是否还在?即服务器何时可以清理为该客户机分配的资源?可以一直等待客户进行下一个方法调用,但该客户机可能再也不调用方法了。在</span><span lang="EN-US">COM</span><span style="FONT-FAMILY: 宋体">领域中,</span><span lang="EN-US">DCOM</span><span style="FONT-FAMILY: 宋体">协议使用</span><span lang="EN-US">ping</span><span style="FONT-FAMILY: 宋体">机制解决了这个问题。客户机把</span><span lang="EN-US">ping</span><span style="FONT-FAMILY: 宋体">和引用对象的信息发送给服务器。客户机在服务器上可能有几百个引用的对象,使</span><span lang="EN-US">ping</span><span style="FONT-FAMILY: 宋体">中的信息非常多。为了使这个机制更加有效,</span><span lang="EN-US">DCOM</span><span style="FONT-FAMILY: 宋体">不发送所有对象的所有信息,而只发送与上一个</span><span lang="EN-US">ping</span><span style="FONT-FAMILY: 宋体">不同的信息。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 16pt"><span style="COLOR: black; FONT-FAMILY: 宋体">这个</span><span lang="EN-US" style="COLOR: black">ping</span><span style="COLOR: black; FONT-FAMILY: 宋体">机制在</span><span lang="EN-US" style="COLOR: black">LAN</span><span style="COLOR: black; FONT-FAMILY: 宋体">上是非常有效的,但是并不适用于可伸缩的解决方案。考虑到有成千上万的客户机向服务器发送</span><span lang="EN-US" style="COLOR: black">ping</span><span style="COLOR: black; FONT-FAMILY: 宋体">,</span><span lang="EN-US" style="COLOR: black">.NET Remoting</span><span style="COLOR: black; FONT-FAMILY: 宋体">为生存期管理提供了一个伸缩性更强的解决方案:即租约分布式垃圾收集器</span><span lang="EN-US" style="COLOR: black">(Leasing Distributed Garbage Collector</span><span style="COLOR: black; FONT-FAMILY: 宋体">,</span><span lang="EN-US" style="COLOR: black">LDGC)</span><span style="COLOR: black; FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 16pt"><span style="FONT-FAMILY: 宋体">这个生存期管理只对客户激活的对象和知名的</span><span lang="EN-US">Singleton</span><span style="FONT-FAMILY: 宋体">对象有效。因为</span><span lang="EN-US">SingleCall</span><span style="FONT-FAMILY: 宋体">对象不保存状态,所以在每个方法调用之后就可以删除它们。客户激活的对象保存状态,我们应该知道它们使用的资源。如果在应用程序域外部引用客户激活的对象,就需要创建租约。租约有一个租约时间。当租约时间为</span><span lang="EN-US"> 0</span><span style="FONT-FAMILY: 宋体">时,租约就已经到期,此时远程对象就会断开连接,最后由垃圾收集器回收。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">1. </span><span style="FONT-FAMILY: 黑体">租约的续约</span></h4>
<p class="MsoNormal" style="LINE-HEIGHT: 16pt"><span style="FONT-FAMILY: 宋体">当租约到期之后,如果客户还调用对象上的方法,就会出现异常。在客户需要租约远程对象的时间超过了</span><span lang="EN-US">300</span><span style="FONT-FAMILY: 宋体">秒</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">默认的租约时间</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">时,有以下</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体">种方法进行续约:</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体">隐式的续约:当客户调用远程对象上的方法时,租约的隐式续约会自动进行。如果当前的租约时间小于</span><span lang="EN-US">RenewOnCallTime</span><span style="FONT-FAMILY: 宋体">的值,则租约时间就设置为</span><span lang="EN-US">RenewOnCallTime</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体">显式的续约:进行显式的续约,客户可以指定新的租约时间,这项工作可以通过</span><span lang="EN-US">ILease</span><span style="FONT-FAMILY: 宋体">接口的</span><span lang="EN-US">Renew()</span><span style="FONT-FAMILY: 宋体">方法完成。通过调用透明代理对象的</span><span lang="EN-US">GetLifetimeService()</span><span style="FONT-FAMILY: 宋体">方法,就可以使用</span><span lang="EN-US">ILease</span><span style="FONT-FAMILY: 宋体">接口。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体">发起租约:这是第三种续约的方法。客户可以创建一个实现</span><span lang="EN-US">ISponsor</span><span style="FONT-FAMILY: 宋体">接口的发起者,并使用</span><span lang="EN-US">ILease</span><span style="FONT-FAMILY: 宋体">接口的</span><span lang="EN-US">Register()</span><span style="FONT-FAMILY: 宋体">方法在租约服务中注册这个发起者。发起者定义租约延长的时间。当租约到期时,发起者就要求延长租约时间。</span> <span style="FONT-FAMILY: 宋体">如果要长期租约服务器上的远程对象,可以使用这个发起租约机制。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">2. </span><span style="FONT-FAMILY: 黑体">租约的<span style="COLOR: black">配置值</span></span></h4>
<p class="MsoNormal" style="LINE-HEIGHT: 16pt"><span style="COLOR: black; FONT-FAMILY: 宋体">可以配置下面的一些值:</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="EN-US">LeaseTime</span><span style="FONT-FAMILY: 宋体">:它定义租约的时间。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="EN-US">RenewOnCallTime</span><span style="FONT-FAMILY: 宋体">:这个时间是租约在方法调用上设置的时间,它指的是续约时间,如果当前租约时间的值低于这个时间,就要进行续约。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US" style="COLOR: black">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="EN-US" style="COLOR: black">SponsorshipTimeout</span><span style="COLOR: black; FONT-FAMILY: 宋体">:如果</span><span lang="EN-US" style="COLOR: black">SponsorshipTimeout</span><span style="COLOR: black; FONT-FAMILY: 宋体">中没有了租约发起者,远程基础结构就</span><span lang="EN-US" style="COLOR: black"> </span><span style="COLOR: black; FONT-FAMILY: 宋体">会寻找下一个发起者。如果没有更多的发起者,则租约就到期。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="EN-US">LeaseManagerPollTime</span><span style="FONT-FAMILY: 宋体">:租约管理器隔一段时间就检查一次,看看有没有对象到期,</span><span lang="EN-US">LeaseManagerPollTime</span><span style="FONT-FAMILY: 宋体">定义的就是这个时间间隔。</span></p>
<p class="MsoNormal" style="LINE-HEIGHT: 16pt"><span style="FONT-FAMILY: 宋体">表</span><span lang="EN-US">16-1</span><span style="FONT-FAMILY: 宋体">中列出了它们的默认值。</span></p>
<p class="a5" style="MARGIN-TOP: 8.15pt"><span style="COLOR: black; FONT-FAMILY: 黑体">表</span><span lang="EN-US" style="COLOR: black"> 16-1</span></p>
<div align="center">
<table class="MsoNormalTable" style="BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-COLLAPSE: collapse; BORDER-BOTTOM-STYLE: none" cellspacing="0" cellpadding="0" border="1">
<tbody>
<tr>
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 9.9pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 9.9pt; BORDER-LEFT-WIDTH: 1pt; BORDER-LEFT-COLOR: windowtext; PADDING-BOTTOM: 0cm; WIDTH: 160.75pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="214">
<p class="a2"><span style="COLOR: black; FONT-FAMILY: 黑体">租</span><span style="COLOR: black"> </span><span style="COLOR: black; FONT-FAMILY: 黑体">借</span><span style="COLOR: black"> </span><span style="COLOR: black; FONT-FAMILY: 黑体">配</span><span style="COLOR: black"> </span><span style="COLOR: black; FONT-FAMILY: 黑体">置</span></p>
</td>
<td style="PADDING-RIGHT: 9.9pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 9.9pt; PADDING-BOTTOM: 0cm; WIDTH: 278.2pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none" valign="top" width="371">
<p class="a2"><span style="COLOR: black; FONT-FAMILY: 黑体">默</span><span style="COLOR: black"> </span><span style="COLOR: black; FONT-FAMILY: 黑体">认</span><span style="COLOR: black"> </span><span style="COLOR: black; FONT-FAMILY: 黑体">值</span><span style="COLOR: black"> <span lang="EN-US">(</span></span><span style="COLOR: black; FONT-FAMILY: 黑体">秒</span><span lang="EN-US" style="COLOR: black">)</span></p>
</td>
</tr>
<tr>
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 9.9pt; PADDING-LEFT: 9.9pt; PADDING-BOTTOM: 0cm; WIDTH: 160.75pt; BORDER-TOP-STYLE: none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT-STYLE: none" valign="top" width="214">
<p class="a4" style="MARGIN-LEFT: 10.7pt"><span lang="EN-US" style="COLOR: black">LeaseTime</span></p>
</td>
<td style="PADDING-RIGHT: 9.9pt; PADDING-LEFT: 9.9pt; PADDING-BOTTOM: 0cm; WIDTH: 278.2pt; BORDER-TOP-STYLE: none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none" valign="top" width="371">
<p class="a4" style="MARGIN-LEFT: 10.7pt; FTEL: 107.45pt"><span lang="EN-US" style="COLOR: black">300</span></p>
</td>
</tr>
<tr>
<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 9.9pt; PADDING-LEFT: 9.9pt; PADDING-BOTTOM: 0cm; WIDTH: 160.75pt; BORDER-TOP-STYLE: none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT-STYLE: none" valign="top" width="214">
<p class="a4" style="MARGIN-LEFT: 10.7pt"><span lang="EN-US" style="COLOR: black">RenewOnCallTime</span></p>
</td>
<td style="PADDING-RIGHT: 9.9pt; PADDING-LEFT: 9.9pt; PADDING-BOTTOM: 0cm; WIDTH: 278.2pt; BORDER-TOP-STYLE: none; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none" valign="top" width="371">
<p class="a4" style="MARGIN-LEFT: 10.7pt; FTEL: 107.45pt"><span lang="EN-US" style="COLOR: black">120</span></p>
</td>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?