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

2021-09-05 13:58:31 字數 3071 閱讀 5564

一步一步學remoting之六:事件(1)

週末又過去了要上班了,一大早起來繼續寫。

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

我們先來改造一下上次的程式,為上次的主線程方法新增事件,能不斷的引發事件來匯報處理的進度:

public

class

myeventargs }

public

myeventargs(

intrate) }

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(

intrate,

string

ip) }

public

class

myobject:marshalbyrefobject

console.writeline(

"非同步方法結束

");

returna+

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   }

然後來修改一下客戶端:

+=new

remoteobject.myobject.myeventhandler(myevent);修改為

remoteobject.eventclass ec

=new

+=new

remoteobject.myobject.myeventhandler(ec.myevent);

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

執行一下程式:

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

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

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

不早了要上班了,在下一節中來改進這2點。

原創 一步一步學Remoting之一 從簡單開始

一步一步學remoting之一 從簡單開始 一 remoting的優缺點?優點 1 能讓我們進行分布式開發 2 tcp通道的remoting速度非常快 3 雖然是遠端的,但是非常接近於本地呼叫物件 4 可以做到保持物件的狀態 5 沒有應用程式限制,可以是控制台,winform,iis,windows...

原創 一步一步學Remoting之一 從簡單開始

一步一步學remoting之一 從簡單開始 一 remoting的優缺點?優點 1 能讓我們進行分布式開發 2 tcp通道的remoting速度非常快 3 雖然是遠端的,但是非常接近於本地呼叫物件 4 可以做到保持物件的狀態 5 沒有應用程式限制,可以是控制台,winform,iis,windows...

一步一步學Remoting系列文章

原創 一步一步學remoting之一 從簡單開始 原創 一步一步學remoting之二 啟用模式 原創 一步一步學remoting之三 複雜物件 原創 一步一步學remoting之四 承載方式 1 原創 一步一步學remoting之四 承載方式 2 原創 一步一步學remoting之五 非同步操作 ...