Remoting的事件機制

2021-04-14 03:03:35 字數 2338 閱讀 1142

概念就不說了,具體參見msdn相關章節:

我們為主執行緒方法新增事件,能不斷的引發事件來匯報處理的進度:

public class myeventargs

} public myeventargs(int rate)

} public class myobject

console.writeline("主線程方法結束");

} protected void onmyevent(myeventargs e)

} }

再來為事件新增處理程式:

class myclient

public static void obj_myevent(object sender,myeventargs e)

}

這個是本地的,遠端物件的事件也這麼簡單嗎?其實沒有想象的簡單,因為物件是在遠端的,服務端的事件客戶端怎麼捕捉?應該說遠端物件的事件可以分成客戶端觸發-》伺服器應答,服務端觸發-》客戶端應答和客戶端觸發-》客戶端應答,第一種就很簡單了,後面2種都需要有乙個中介軟體。下面我們來要為程物件同樣來新增乙個進度機制,首先來建立我們的遠端物件:

[serializable]

public class myeventargs:eventargs

} public string ip

} public myeventargs(int rate,string ip)

} public class myobject:marshalbyrefobject

console.writeline("非同步方法結束");

return a+b;

} protected void onmyevent(myeventargs e)

} }

為了除錯方便,伺服器端和客戶端這次都用程式實現,下面是伺服器端:

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;

using system.net;

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 myevent(object sender,remoteobject.myeventargs e)

public static void method()

}

**看上去不錯,可是debug啟動後報錯: 

這就是我前面提到的問題,遠端不可能有本地的程式集,也無法觸發本地事件。解決辦法就是加乙個事件中介軟體,繼承marshalbyrefobject:

public class eventclass:marshalbyrefobject

}

然後來修改一下客戶端:

remoteobject.eventclass ec=new remoteobject.eventclass();

刪除客戶端的myevent靜態方法。

執行一下程式: 

前後兩個視窗本別是服務端和客戶端的,貌似達到了我們的要求,其實不然,程式有2個漏洞:

1、客戶端關閉以後開啟新的程式就出錯,因為以前的委託鏈丟失,服務端程式企圖觸發事件出錯。

2、同時開啟幾個客戶端,客戶端收到的是所有的進度資訊,而不僅僅是自己的,廣播性質的訊息。 

Remoting事件處理

應用remoting技術的分布式處理程式,通常包括三部分 遠端物件 服務端 客戶端。因此從事件的方向上看,就應該有三種形式 1 服務端訂閱客戶端事件 2 客戶端訂閱服務端事件 3 客戶端訂閱客戶端事件 服 務端訂閱客戶端事件,即由客戶端傳送訊息,服務端捕捉該訊息,然後響應該事件,相當於下級向上級發傳...

Remoting遠端處理事件呼叫的問題

remoting遠端處理事件呼叫的問題 title 在.net remoting技術中可以遠端進行事件通知,但是我在使用時發現問題,提示資訊為 不允許型別 system.delegateserializationholder 和從中派生的型別 例如 system.delegateserializat...

利用Remoting實現非同步佇列機制

很多需要提高應用效能 提高立即響應速度 但不立即處理 提高吞吐能力 提公升使用者體驗 的場景,都採用非同步處理的機制,net 中可能用 msmq 的實現樣例不少,其實自行實現非同步佇列並不複雜。最近有兩個專案組的同事向我要了類似的關於實現非同步佇列的方法,於是翻出了兩年以前寫的實現 sp 與運營商簡...