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 = &quot;Hello&quot;;</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">&nbsp;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">object[] attrs = {new UrlAttribute(&quot;tcp://localhost:8086/Hello&quot;) }</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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (lease != null)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Lease Configuration:&quot;);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;InitialLeaseTime: &quot; +</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lease.InitialLeaseTime);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;RenewOnCallTime: &quot; +</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lease.RenewOnCallTime);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;SponsorshipTimeout: &quot; +</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lease.SponsorshipTimeout);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; LINE-HEIGHT: 15pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</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">&nbsp; 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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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">&nbsp;&nbsp; public Hello()</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; {</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Constructor called&quot;);</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; }</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; ~Hello()</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; {</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Destructor called&quot;);</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; public override Object InitializeLifetimeService()</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp; {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ILease lease = (ILease)base.InitializeLifetimeService();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lease.InitialLeaseTime = TimeSpan.FromMinutes(10);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lease.RenewOnCallTime = TimeSpan.FromSeconds(40);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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">&nbsp;&nbsp; }</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>&nbsp;&nbsp;&nbsp;<a href="index.html">首页</a>&nbsp;&nbsp;&nbsp;<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 + -
显示快捷键?