婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Microsoft .Net Remoting系列教程之二:Marshal、Disconnect與生命周期以及跟蹤服務(wù)

Microsoft .Net Remoting系列教程之二:Marshal、Disconnect與生命周期以及跟蹤服務(wù)

熱門標(biāo)簽:蘇州如何辦理400電話 400電話辦理怎么樣 聯(lián)通官網(wǎng)400電話辦理 網(wǎng)絡(luò)電話外呼系統(tǒng)上海 西寧呼叫中心外呼系統(tǒng)線路商 地圖標(biāo)注軟件免費(fèi)下載 外呼電話機(jī)器人成本 百應(yīng)電話機(jī)器人外呼系統(tǒng) 臨沂智能電話機(jī)器人加盟

一、遠(yuǎn)程對象的激活

  在Remoting中有三種激活方式,一般的實(shí)現(xiàn)是通過RemotingServices類的靜態(tài)方法來完成。工作過程事實(shí)上是將該遠(yuǎn)程對象注冊到通道中。由于Remoting沒有提供與之對應(yīng)的Unregister方法來注銷遠(yuǎn)程對象,所以如果需要注冊/注銷指定對象,微軟推薦使用Marshal(一般譯為編組)和Disconnect配對使用。在《Net Remoting基礎(chǔ)篇》中我已經(jīng)談到:Marshal()方法是將MarshalByRefObject類對象轉(zhuǎn)化為ObjRef類對象,這個(gè)對象是存儲生成代理以與遠(yuǎn)程對象通訊所需的所有相關(guān)信息。這樣就可以將該實(shí)例序列化以便在應(yīng)用程序域之間以及通過網(wǎng)絡(luò)進(jìn)行傳輸,客戶端就可以調(diào)用了。而Disconnect()方法則將具體的實(shí)例對象從通道中斷開。

  根據(jù)上述說明,Marshal()方法對遠(yuǎn)程對象以引用方式進(jìn)行編組(Marshal-by-Reference,MBR),并將對象的代理信息放到通道中。客戶端可以通過Activator.GetObject()來獲取。如果用戶要注銷該對象,則通過調(diào)用Disconnect()方法。那么這種方式對于編組的遠(yuǎn)程對象是否存在生命周期的管理呢?這就是本文所要描述的問題。

二、生命周期

  在CLR中,框架提供了GC(垃圾回收器)來管理內(nèi)存中對象的生命周期。同樣的,.Net Remoting使用了一種分布式垃圾回收,基于租用的形式來管理遠(yuǎn)程對象的生命周期。

  早期的DCOM對于對象生命周期的管理是通過ping和引用計(jì)數(shù)來確定對象何時(shí)應(yīng)當(dāng)作為垃圾回收。然而ping引起的網(wǎng)絡(luò)流量對分布式應(yīng)用程序的性能是一種痛苦的負(fù)擔(dān),它大大地影響了分布式處理的整體性能。.Net Remoting在每個(gè)應(yīng)用程序域中都引入一個(gè)租用管理器,為每個(gè)服務(wù)器端的SingleTon,或每個(gè)客戶端激活的遠(yuǎn)程對象保存著對租用對象的引用。(說明:對于服務(wù)器端激活的SingleCall方式,由于它是無狀態(tài)的,對于每個(gè)激活的遠(yuǎn)程對象,都由CLR的GC來自動回收,因此對于SingleCall模式激活的遠(yuǎn)程對象,不存在生命周期的管理。)

1、租用

  租用是個(gè)封裝了TimeSpan值的對象,用以管理遠(yuǎn)程對象的生存期。在.Net Remoting中提供了定義租用功能的ILease接口。當(dāng)Remoting通過SingleTon模式或客戶端激活模式來激活遠(yuǎn)程對象時(shí),租用對象調(diào)用從System.MarshalByRefObject繼承的InitializeLifetimeService方法,向?qū)ο笳埱笞庥谩?/p>

ILease接口定義了有關(guān)生命周期的屬性,均為TimeSpan值。如下:

InitialLeaseTime:初始化有效時(shí)間,默認(rèn)值為300秒,如果為0,表示永不過期;
RenewOnCallTime:調(diào)用遠(yuǎn)程對象一個(gè)方法時(shí)的租用更新時(shí)間,默認(rèn)值為120秒;
SponsorshipTimeout:超時(shí)值,通知Sponsor(發(fā)起人)租用過期后,Remoting會等待的時(shí)間,默認(rèn)值為120秒;
CurrentLeaseTime:當(dāng)前租用時(shí)間,首次獲得租用時(shí),為InitializeLeaseTime的值。

Remoting的遠(yuǎn)程對象因?yàn)槔^承了MarshalByRefObject,因此默認(rèn)繼承了InitializeLifetimeService方法,那么租用的相關(guān)屬性為默認(rèn)值。如果要改變這些設(shè)置,可以在遠(yuǎn)程對象中重寫該方法。例如:

public override object InitializeLifetimeService()
{
 ILease lease = (ILease)base.InitializeLifetimeService();
 if (lease.CurrentState == LeaseState.Initial)
 {
 lease.InitialLeaseTime = TimeSpan.FromMinutes(1);
 lease.RenewOnCallTime = TimeSpan.FromSeconds(20);
 }
 return lease; 
}

也可以忽略該方法,將對象的租用周期改變?yōu)闊o限:

public override object InitializeLifetimeService()
{
 return null;
}

2、租用管理器

  如果是前面所說的租用主要是應(yīng)用在每個(gè)具體的遠(yuǎn)程對象上,那么租用管理器是服務(wù)器端專門用來管理遠(yuǎn)程對象生命周期的管理器,它維持著一個(gè)System.Hashtable成員,將租用映射為System.DateTime實(shí)例表示每個(gè)租用何時(shí)應(yīng)過期。Remoting采用輪詢的方式以一定的時(shí)間喚醒租用管理器,檢查每個(gè)租用是否過期。默認(rèn)為每10秒鐘喚醒一次。輪詢的間隔可以配置,如將輪詢間隔設(shè)置為5分鐘:

LifetimeService.LeaseManagerPollTime = System.TimeSpan.FromMinutes(5);

我們還可以在租用管理器中設(shè)置遠(yuǎn)程對象租用的屬性,如改變遠(yuǎn)程對象的初始有效時(shí)間為永久有效:

LifetimeServices.LeaseTime = TimeSpan.Zero;

我們也可以通過配置文件來設(shè)置生命周期,如:

configuration>
 system.runtime.remoting>
 application name = "SimpleServer">
  lifetime leaseTime = "0" sponsorshipTimeOut = "1M" renewOnCallTime = "1M" pollTime = "30S"/> 
 /application>
 /system.runtime.remoting>
/configuration>

注:配置文件中的pollTime即為上面所說的租用管理器的輪詢間隔時(shí)間LeaseManagerPollTime。

  租用管理器對于生命周期的設(shè)置是針對服務(wù)器上所有的遠(yuǎn)程對象。當(dāng)我們通過配置文件或租用管理器設(shè)置租用的屬性時(shí),所有遠(yuǎn)程對象的生命周期都遵循該設(shè)置,除非我們對于指定的遠(yuǎn)程對象通過重寫InitializeLifetimeService方法,改變了相關(guān)配置。也就是說,遠(yuǎn)程對象的租用配置優(yōu)先級高于服務(wù)器端配置。

3、發(fā)起人(Sponsor)

  發(fā)起人是針對客戶端而言的。遠(yuǎn)程對象就是發(fā)起人要租用的對象,發(fā)起人可以與服務(wù)器端簽訂租約,約定租用時(shí)間。一旦到期后,發(fā)起人還可以續(xù)租,就像現(xiàn)實(shí)生活中租方的契約,房東、租房者之間的關(guān)系一樣。

  在.Net Framework中的System.Runtime.Remoting.Lifetime命名空間中定義了ClientSponsor類,該類繼承了System.MarshalByRefObject,并實(shí)現(xiàn)了ISponsor接口。ClientSponsor類的屬性和方法,可以參考MSDN。

  客戶端要使用發(fā)起人機(jī)制,必須創(chuàng)建ClientSponsor類的一個(gè)實(shí)例。然后調(diào)用相關(guān)方法如Register()或Renewal()方法來注冊遠(yuǎn)程對象或延長生命周期。如:

RemotingObject obj = new RemotingObject();
ClientSponsor sponsor = new ClientSponsor();
sponsor.RenewalTime = TimeSpan.FromMinutes(2);
sponsor.Register(obj);

續(xù)租時(shí)間也可以在ClientSponsor的構(gòu)造函數(shù)中直接設(shè)置,如:

ClientSponsor sponsor = new ClientSponsor(TimeSpan.FromMinutes(2));
sponsor.Register(obj);

我們也可以自己編寫Sponsor來管理發(fā)起人機(jī)制,這個(gè)類必須繼承ClientSponsor并實(shí)現(xiàn)ISponsor接口。

三、跟蹤服務(wù)

  如前所述,我們要判斷通過Marshal編組遠(yuǎn)程對象是否存在生命周期的管理。在Remoting中,可以通過跟蹤服務(wù)程序來監(jiān)視MBR對象的編組進(jìn)程。

  我們可以創(chuàng)建一個(gè)簡單的跟蹤處理程序,該程序?qū)崿F(xiàn)接口ITrackingHandler。接口ITrackingHandler定義了3個(gè)方法,MarshalObject、UnmarshalObject和DisconnectedObject。當(dāng)遠(yuǎn)程對象被編組、解組和斷開連接時(shí),就會調(diào)用相應(yīng)的方法。下面是該跟蹤處理類的代碼:

public class MyTracking:ITrackingHandler
{
 public MyTracking()
 {
 //
 // TODO: 在此處添加構(gòu)造函數(shù)邏輯
 //
 }

 public void MarshaledObject(object obj,ObjRef or)
 {
 Console.WriteLine();
 Console.WriteLine("對象" + obj.Tostring() + " is marshaled at " + DateTime.Now.ToShortTimeString());
 }

 public void UnmarshaledObject(object obj,ObjRef or)
 {
 Console.WriteLine();
 Console.WriteLine("對象" + obj.Tostring() + " is unmarshaled at " + DateTime.Now.ToShortTimeString());
 }

 public void DisconnectedObject(object obj)
 {
 Console.WriteLine(obj.ToString() + " is disconnected at " + DateTime.Now.ToShortTimeString());
 }
}

然后再服務(wù)器端創(chuàng)建該跟蹤處理類的實(shí)例,并注冊跟蹤服務(wù):
TrackingServices.RegisterTrackingHandler(new MyTracking());

四、測試

1、建立兩個(gè)遠(yuǎn)程對象,并重寫InitializeLifetimeService方法:

對象一:AppService1
初始生命周期:1分鐘

public class AppService1:MarshalByRefObject
{
 public void PrintString(string contents)
 {
 Console.WriteLine(contents); 
 }

 public override object InitializeLifetimeService()
 {
 ILease lease = (ILease)base.InitializeLifetimeService();
 if (lease.CurrentState == LeaseState.Initial)
 {
  lease.InitialLeaseTime = TimeSpan.FromMinutes(1);
  lease.RenewOnCallTime = TimeSpan.FromSeconds(20);
 }
 return lease;
 }
}

對象二:AppService2
初始生命周期:3分鐘

public class AppService2:MarshalByRefObject
{
 public void PrintString(string contents)
 {
 Console.WriteLine(contents); 
 }

 public override object InitializeLifetimeService()
 {
 ILease lease = (ILease)base.InitializeLifetimeService();
 if (lease.CurrentState == LeaseState.Initial)
 {
  lease.InitialLeaseTime = TimeSpan.FromMinutes(3);
  lease.RenewOnCallTime = TimeSpan.FromSeconds(40);
 }
 return lease;
 }
}

為簡便起見,兩個(gè)對象的方法都一樣。

2、服務(wù)器端

(1) 首先建立如上的監(jiān)控處理類;

(2) 注冊通道:

TcpChannel channel = new TcpChannel(8080);
ChannelServices.RegisterChannel(channel);

(3) 設(shè)置租用管理器的初始租用時(shí)間為無限:

LifetimeServices.LeaseTime = TimeSpan.Zero;

(4) 創(chuàng)建該跟蹤處理類的實(shí)例,并注冊跟蹤服務(wù):

TrackingServices.RegisterTrackingHandler(new MyTracking());

(5) 編組兩個(gè)遠(yuǎn)程對象:

ServerAS.AppService1 service1 = new ServerAS1.AppService1();
ObjRef objRef1 = RemotingServices.Marshal((MarshalByRefObject)service1,"AppService1");

ServerAS.AppService2 service2 = new ServerAS1.AppService2();
ObjRef objRef2 = RemotingServices.Marshal((MarshalByRefObject)service2,"AppService2");

(6) 使服務(wù)器端保持運(yùn)行:

Console.WriteLine("Remoting服務(wù)啟動,按退出..."); 
Console.ReadLine();

3、客戶端

通過Activator.GetObject()獲得兩個(gè)遠(yuǎn)程對象,并調(diào)用其方法PrintString。代碼略。

4、運(yùn)行測試:

運(yùn)行服務(wù)器端和客戶端,由于監(jiān)控程序?qū)⒈O(jiān)視遠(yuǎn)程對象的編組進(jìn)程,因此在運(yùn)行開始,就會顯示遠(yuǎn)程對象已經(jīng)被Marshal:

然后再客戶端調(diào)用這兩個(gè)遠(yuǎn)程對象的PrintString方法,服務(wù)器端接受字符串:

一分鐘后,遠(yuǎn)程對象一自動被Disconnect:

此時(shí)客戶端如要調(diào)用遠(yuǎn)程對象一,會拋出RemotingException異常;

又一分鐘后,遠(yuǎn)程對象二被Disconnect了:

  用戶還可以根據(jù)這個(gè)代碼測試RenewOnCallTime的時(shí)間是否正確。也即是說,在對象還未被Disconnect時(shí),調(diào)用對象,則從調(diào)用對象的這一刻起,其生命周期不再是原來設(shè)定的初始有效時(shí)間值(InitialLeaseTime),而是租用更新時(shí)間值(RenewOnCallTime)。另外,如果這兩個(gè)遠(yuǎn)程對象沒有重寫InitializeLifetimeService方法,則生命周期應(yīng)為租用管理器所設(shè)定的值,為永久有效(設(shè)置為0)。那么這兩個(gè)對象不會被自動Disconnect,除非我們顯式指定關(guān)閉它的連接。當(dāng)然,如果我們顯式關(guān)閉連接,跟蹤程序仍然會監(jiān)視到它的變化,然后顯示出來。

五、結(jié)論

  通過我們的測試,其實(shí)結(jié)論已經(jīng)很明顯了。通過Marshal編組的對象要受到租用的生命周期所控制。注意對象被Disconnect,并不是指這個(gè)對象被GC回收,而是指這個(gè)對象保存在通道的相關(guān)代理信息被斷開了,而對象本身仍然在服務(wù)器端存在。

  所以我們通過Remoting提供服務(wù),應(yīng)根據(jù)實(shí)際情況指定遠(yuǎn)程對象的生命周期,如果不指定,則為Remoting默認(rèn)的設(shè)定。要讓所有的遠(yuǎn)程對象永久有效,可以通過配置文件或租用管理器將初始有效時(shí)間設(shè)為0。

  以上就是.Net Remoting中Marshal、Disconnect與生命周期以及跟蹤服務(wù)全部內(nèi)容,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Microsoft .Net Remoting系列教程之三:Remoting事件處理全接觸
  • Microsoft .Net Remoting系列教程之一:.Net Remoting基礎(chǔ)篇
  • Flex 錯(cuò)誤(mx.messaging.messages::RemotingMessage)分析
  • ASP.NET通過Remoting service上傳文件
  • java webservice上傳下載文件代碼分享
  • java通過客戶端訪問服務(wù)器webservice的方法
  • ASP.NET使用WebService實(shí)現(xiàn)天氣預(yù)報(bào)功能
  • jQuery調(diào)用Webservice傳遞json數(shù)組的方法
  • C# WebService發(fā)布以及IIS發(fā)布
  • Remoting和Webservice的詳細(xì)介紹及區(qū)別

標(biāo)簽:臨夏 中衛(wèi) 海西 清遠(yuǎn) 甘肅 聊城 慶陽

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Microsoft .Net Remoting系列教程之二:Marshal、Disconnect與生命周期以及跟蹤服務(wù)》,本文關(guān)鍵詞  Microsoft,.Net,Remoting,系列,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Microsoft .Net Remoting系列教程之二:Marshal、Disconnect與生命周期以及跟蹤服務(wù)》相關(guān)的同類信息!
  • 本頁收集關(guān)于Microsoft .Net Remoting系列教程之二:Marshal、Disconnect與生命周期以及跟蹤服務(wù)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    中文字幕第一区综合| 欧美日韩国产大片| 欧美国产精品一区| 91伊人久久大香线蕉| 亚洲欧美日韩国产手机在线 | 久久精品一区二区| 成人午夜大片免费观看| 亚洲日本电影在线| 欧美巨大另类极品videosbest | 免费成人在线影院| 久久综合色天天久久综合图片| 国产69精品久久99不卡| 一区二区三区四区视频精品免费| 欧美精品精品一区| 国产99一区视频免费| 亚洲综合色噜噜狠狠| 日韩免费视频一区| aa级大片欧美| 日本欧美肥老太交大片| 中文字幕av一区二区三区免费看| 欧美在线影院一区二区| 国产一区 二区| 亚洲精品国产一区二区精华液| 在线不卡一区二区| 国产成人午夜电影网| 亚洲国产欧美一区二区三区丁香婷| 欧美tk—视频vk| 9人人澡人人爽人人精品| 日本女优在线视频一区二区| 欧美高清在线一区二区| 日韩午夜在线观看视频| 99精品欧美一区二区蜜桃免费 | 日韩美女视频一区| 欧美一级理论片| 色综合久久中文字幕| 国内精品视频一区二区三区八戒| 一区二区三区四区视频精品免费 | 日韩精品一级中文字幕精品视频免费观看 | 欧美成人综合网站| 一本到高清视频免费精品| 精品综合免费视频观看| 亚洲最新视频在线观看| 中文字幕精品一区| 日韩欧美成人激情| 欧美视频精品在线观看| 成人激情开心网| 国产美女av一区二区三区| 日韩高清在线观看| 亚洲成人精品一区二区| 亚洲欧洲av色图| 久久亚区不卡日本| 日韩午夜激情电影| 欧美男女性生活在线直播观看| 99久久精品国产观看| 顶级嫩模精品视频在线看| 久久99精品久久久| 免费xxxx性欧美18vr| 婷婷综合在线观看| 亚洲一线二线三线久久久| 中文字幕在线视频一区| 中文字幕精品一区二区精品绿巨人| 精品国产乱码久久久久久图片 | 亚洲精品一区二区三区99| 91精品久久久久久蜜臀| 在线不卡欧美精品一区二区三区| 91黄视频在线观看| 欧美在线看片a免费观看| 91视频在线观看| 97se亚洲国产综合自在线不卡| jlzzjlzz欧美大全| 97精品国产露脸对白| 色婷婷av一区二区三区大白胸 | 国产精品福利电影一区二区三区四区| 欧美tickling挠脚心丨vk| 欧美一区二区三区在线视频| 欧美区一区二区三区| 4438x亚洲最大成人网| 538prom精品视频线放| 日韩一区二区免费在线观看| 日韩一区二区三区视频在线| 欧美成人r级一区二区三区| 久久你懂得1024| 国产午夜精品久久久久久免费视 | 日韩精品福利网| 免费一区二区视频| 国产剧情一区二区| av一二三不卡影片| 欧美在线高清视频| 69堂亚洲精品首页| 国产亚洲欧美一级| 亚洲乱码国产乱码精品精小说 | 偷拍一区二区三区| 九九精品一区二区| www.一区二区| 欧美精三区欧美精三区| 久久午夜色播影院免费高清| 中文字幕中文在线不卡住| 亚洲一二三专区| 另类中文字幕网| 成人妖精视频yjsp地址| 在线观看av一区二区| 欧美成人性战久久| 自拍偷拍亚洲综合| 免费视频最近日韩| 91浏览器打开| 欧美xxx久久| 亚洲视频资源在线| 美女一区二区视频| 白白色 亚洲乱淫| 欧美一区二区三区的| 国产精品久久久久9999吃药| 日韩中文字幕一区二区三区| 成人午夜在线免费| 日韩一级完整毛片| 亚洲图片激情小说| 男女男精品视频| 91亚洲资源网| 精品国产乱码久久久久久久| 一区二区三区在线免费视频| 麻豆精品视频在线| 欧美系列在线观看| 国产欧美日韩另类视频免费观看| 亚洲成av人片在线| aaa亚洲精品一二三区| 欧美精品一区二区三区蜜桃| 亚洲成年人网站在线观看| 成人av在线网| 精品少妇一区二区三区免费观看 | 成人免费视频一区| 欧美成人激情免费网| 亚洲国产日韩精品| 91在线免费看| 国产亚洲综合av| 乱一区二区av| 欧美精品vⅰdeose4hd| 一区二区三区毛片| 91在线码无精品| 国产精品毛片久久久久久| 狠狠狠色丁香婷婷综合激情| 欧美一级理论性理论a| 亚洲第四色夜色| 91国偷自产一区二区三区观看| 中文字幕国产一区| 国产成人日日夜夜| 国产日韩视频一区二区三区| 久久精品国内一区二区三区| 欧美年轻男男videosbes| 亚洲久本草在线中文字幕| 国产成人av影院| 久久亚洲精品国产精品紫薇| 久久丁香综合五月国产三级网站| 欧美在线一区二区三区| 亚洲中国最大av网站| 在线一区二区三区四区| 一区二区在线电影| 欧美综合亚洲图片综合区| 一区二区三区中文字幕电影| 一本色道亚洲精品aⅴ| 亚洲欧美日韩一区二区| 在线免费不卡视频| 亚洲一区国产视频| 制服丝袜日韩国产| 久久99精品久久久| 欧美理论在线播放| 青青草一区二区三区| 欧美一二三区在线观看| 久久成人免费电影| 久久亚洲精品国产精品紫薇| 国产精品一二三四五| 国产精品久久综合| av在线不卡观看免费观看| 一区二区三区四区乱视频| 欧美日韩在线电影| 婷婷中文字幕一区三区| 精品国产一区二区在线观看| 国产成人8x视频一区二区| 国产精品美女www爽爽爽| 色婷婷激情综合| 五月天欧美精品| 精品久久久久久久久久久久包黑料 | 韩国理伦片一区二区三区在线播放| 久久亚洲一区二区三区四区| av电影在线观看完整版一区二区| 亚洲永久精品大片| 亚洲精品一线二线三线| 不卡的av电影在线观看| 亚洲国产一区二区三区青草影视| 91精品国产高清一区二区三区| 麻豆精品视频在线| 1区2区3区欧美| 在线不卡的av| 成人污污视频在线观看| 亚洲一区二区三区不卡国产欧美| 制服丝袜在线91| 成人ar影院免费观看视频| 天天综合色天天综合| 国产蜜臀av在线一区二区三区| 色老综合老女人久久久| 国产毛片精品一区| 亚洲综合色在线|