一步一步學Remoting之六 事件(2)

2021-04-01 02:00:17 字數 1880 閱讀 1181

(原創)一步一步學remoting之六:事件(2)

到了午休的時間,抓緊時間繼續寫,上次說有2個遺留問題:

(1)關閉乙個客戶端以後會影響其他的客戶端事件

原因:客戶端沒有取消事件訂閱就關閉了,觸發事件的時候找不到事件訂閱者

解決:遍歷委託鏈,找到異常的物件,從委託鏈中卸下

(2)伺服器端對客戶端廣播,客戶端能收到其他客戶端的事件處理資訊

原因:使用了singleton模式,共享遠端物件

解決:因為需要遠端物件有狀態且不共享例項,所以只有客戶端啟用可以選擇

修改後的服務端:

using

system; 

using

system.collections; 

using

system.runtime.remoting; 

using

system.runtime.remoting.channels; 

using

system.runtime.remoting.channels.tcp; 

using

system.runtime.serialization.formatters; 

namespace

remoteserver  } 

修改後的遠端物件:

using

system; 

namespace

remoteobject  } 

public

string

ip  

} public

myeventargs(

intrate,

string

ip)  } 

public

class

myobject:marshalbyrefobject 

console.writeline("來自

"+ip+

"的非同步方法結束

"); 

returna+

b; } 

protected

void

onmyevent(myeventargs e) 

catch}} 

} } 

public

class

eventclass:marshalbyrefobject 

} } 

修改後的客戶端:

using

system; 

using

system.***; 

using

system.collections; 

using

system.text; 

using

system.runtime.remoting; 

using

system.runtime.remoting.channels; 

using

system.runtime.remoting.channels.tcp; 

using

system.runtime.serialization.formatters; 

class

myclient 

public

static

void

callback(iasyncresult iar) 

}  

public

static

void

method()  } 

之所以要在ip位址後面跟上隨機數,是因為可能在乙個機器上會開啟多個客戶端,需要在這個時候能在伺服器端區分多個客戶端。

備註:我的所有例子都是在客戶端和伺服器端部署遠端物件的,其實這個做法不是很好,我們應該僅僅把介面部署在兩地,遠端物件僅僅部署在伺服器端即可。

一步一步學Remoting之六 事件

我們先來改造一下上次的程式,為上次的主線程方法新增事件,能不斷的引發事件來匯報處理的進度 public class myeventargs public myeventargs intrate public class myobject console.writeline 主線程方法結束 prote...

一步一步學Remoting之六 事件(2)

到了午休的時間,抓緊時間繼續寫,上次說有2個遺留問題 1 關閉乙個客戶端以後會影響其他的客戶端事件 原因 客戶端沒有取消事件訂閱就關閉了,觸發事件的時候找不到事件訂閱者 解決 遍歷委託鏈,找到異常的物件,從委託鏈中卸下 2 伺服器端對客戶端廣播,客戶端能收到其他客戶端的事件處理資訊 原因 使用了si...

原創 一步一步學Remoting之六 事件(2)

原創 一步一步學remoting之六 事件 2 到了午休的時間,抓緊時間繼續寫,上次說有2個遺留問題 1 關閉乙個客戶端以後會影響其他的客戶端事件 原因 客戶端沒有取消事件訂閱就關閉了,觸發事件的時候找不到事件訂閱者 解決 遍歷委託鏈,找到異常的物件,從委託鏈中卸下 2 伺服器端對客戶端廣播,客戶端...