100165477.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 182 行 · 第 1/2 页
HTM
182 行
</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">SponsorshipTimeout</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>
</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">LeaseManagerPollTime</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">10</span></p>
</td>
</tr>
</tbody>
</table>
</div>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">3. </span><span style="FONT-FAMILY: 黑体">管理生存期所使用的类</span></h4>
<p class="MsoNormal"><span lang="EN-US">ClientSponsor</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">LeaseState</span><span style="FONT-FAMILY: 宋体">枚举类型指定的。通过</span><span lang="EN-US">LifetimeServices</span><span style="FONT-FAMILY: 宋体">实用类,可以为应用程序域中所有远程对象的租约设置或获取属性。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">4. </span><span style="FONT-FAMILY: 黑体">获取租约信息</span></h4>
<p class="MsoNormal"><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><span lang="EN-US">System.Runtime.Remoting.Lifetime</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">租约机制只能用于有状态的</span><span lang="EN-US">(</span><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">SingleCall</span><span style="FONT-FAMILY: 宋体">对象。为了给服务器提供客户激活的对象,可以把远程配置改为调用文件</span><span lang="EN-US">HelloServer.cs</span><span style="FONT-FAMILY: 宋体">中的方法</span><span lang="EN-US">RegisterActivatedServiceType()</span><span style="FONT-FAMILY: 宋体">:</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">RemotingConfiguration.ApplicationName = "Hello";</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">RemotingConfiguration.RegisterActivatedServiceType(typeof(Hello));</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在客户应用程序中,远程对象的实例化也必须修改。在此</span><span lang="EN-US">,</span><span style="FONT-FAMILY: 宋体">并不使用方法</span><span lang="EN-US">Activator.GetOnject()</span><span style="FONT-FAMILY: 宋体">,而是使用方法</span><span lang="EN-US">Activator.CreateInstance()</span><span style="FONT-FAMILY: 宋体">来调用客户激活的对象:</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">ChannelServices.RegisterChannel(new TcpChannel());</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">object[] attrs = {new UrlAttribute("tcp://localhost:8086/Hello") }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">Hello obj = (Hello) Activator.CreateInstance(typeof(Hello), null, attrs);</span></p>
<p class="MsoNormal"><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="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> ILease lease = (ILease)obj.GetLifetimeService();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> if (lease != null)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> Console.WriteLine("Lease Configuration:");</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> Console.WriteLine("InitialLeaseTime: " +</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> lease.InitialLeaseTime);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> Console.WriteLine("RenewOnCallTime: " +</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> lease.RenewOnCallTime);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> Console.WriteLine("SponsorshipTimeout: " +</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> lease.SponsorshipTimeout);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US"> Console.WriteLine(lease.CurrentLeaseTime);</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体">在客户控制台的窗口中,可以看到如图</span><span lang="EN-US" style="COLOR: black">16-10</span><span style="COLOR: black; FONT-FAMILY: 宋体">所示的输出结果。</span></p>
<p align="center"><span lang="EN-US"><img height="114" src="16/image010.jpg" width="212" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="COLOR: black; FONT-FAMILY: 宋体">图</span><span lang="EN-US" style="COLOR: black"> 16-10</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">5. </span><span style="FONT-FAMILY: 黑体">改变默认的租约配置</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">使用</span><span lang="EN-US">System.Runtime.Remoting.Lifetime.LifetimeServices</span><span style="FONT-FAMILY: 宋体">实用类,服务器自身就可以为所有的远程对象改变默认的租约配置:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> LifetimeServices.LeaseTime = TimeSpan.FromMinutes(10);</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> LifetimeServices.RenewOnCallTime = TimeSpan.FromMinutes(2);</span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体">如果希望各个默认生存期依赖于远程对象的类型,则可以重写</span><span lang="EN-US" style="COLOR: black">MarshalByRefObject</span><span style="COLOR: black; FONT-FAMILY: 宋体">基类的</span><span lang="EN-US" style="COLOR: black">InitializeLifetimeService()</span><span style="COLOR: black; FONT-FAMILY: 宋体">方法,改变远程对象的租约配置:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">public class Hello : System.MarshalByRefObject</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public Hello()</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Console.WriteLine("Constructor called");</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> ~Hello()</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> Console.WriteLine("Destructor called");</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> public override Object InitializeLifetimeService()</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> ILease lease = (ILease)base.InitializeLifetimeService();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> lease.InitialLeaseTime = TimeSpan.FromMinutes(10);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> lease.RenewOnCallTime = TimeSpan.FromSeconds(40);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> return lease;</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="MsoNormal"><span style="COLOR: black; FONT-FAMILY: 宋体">使用后面讨论的配置文件,也可以完成生存期服务的配置。</span></p></div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100165476.htm">上一页</a> <a href="index.html">首页</a> <a href="100165478.htm">下一页</a>
</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="divCurrentNode2" 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="divRealteNod2" 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>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?