C 參考 事件機制

2022-04-10 14:49:52 字數 2638 閱讀 9027

還是那個專案,為了降低程式的耦合性,我決定小小的重構一下自己原來的**,把socket通訊和幀的分析這兩部分分別封裝成乙個類,當然執行緒沒有變,只是封裝了一下,為的就是模組測試完容易拼接。這也是我打算降低耦合度的原因,不然根本沒法拼接,好亂好亂。

但是封裝socket通訊和資料分析模組就帶來了一些問題。現在有兩個類:

ui類,負責介面顯示和繪製

socketutil類,負責通訊,抓取資料

所以我在ui類中new了乙個socketutil類,然後利用這個socketutil類例項中的方法通訊。

但是這就產生問題了,我需要socketutil類例項的一些函式反饋一些實時資訊給ui類的某個label(這是的socketutil類是不知道ui類存在的,也不能把ui類的例項傳給socketutil類,因為它是ui類,所以socketutil類的函式**中根本沒有任何和ui類相關的東西)。於是想到了c#的事件就能解決這個問題。

在所有關於c#事件機制的介紹中,我更傾向於發布者/訂閱者(publisher/subscriber)這種描述。理解事件機制並不是一件容易的事情,它所涉及的思想值得我們好好去研究。

本文資源來自《c#與.net技術平台實戰演練》——中國青年出版社

談到事件,我們涉及到兩個角色:事件發布者(publisher)和事件訂閱者(scriber),也可以說是事件傳送者(sender)和事件接收者(receiver)的關係。舉個例子來說,市面上目前有許多雜誌,雜誌的種類也很多。而我只對其中的某些感興趣,那麼我就可以向雜誌發行商提出訂閱。之後,每當雜誌發行時,我就會收到我在雜誌發行商那兒訂閱的雜誌。在這個關係中,雜誌發行商就相當於事件發行者,而我就是事件訂閱者。每當雜誌發行時,就觸發了乙個發行事件。

用物件導向的語言解釋,這兩者的意義如下:

事件發行者(publisher)

它是乙個物件,且會維護自身的狀態資訊。每當狀態資訊發生變動時,便觸發乙個事件,並通知所有的事件訂閱者。對於雜誌發行商來說,每本雜誌都有自己的資訊在裡面,當雜誌發行時,我要通知訂閱該雜誌的人:雜誌已經發行啦,請注意查收!

事件接收者(receiver)

以下是.net事件處理機制的模型:

下面給乙個簡單的例子,用以闡述事件的思想:

using

system.collections.generic;

using

system.text;

namespace

eventdemo}}

public

class

humanresource

public

static

void

main()}}

在這個例子中,employee類相當於乙個事件發布者(publisher),它定義了事件的相關資訊,包括定義了乙個事件用於計算薪水(onsalarycompute),以及乙個觸發事件的函式(fireevent()),為簡單起見,本例沒有加上事件引數。

與之相對應,humanresource類則相當於乙個事件訂閱者(subscriber),它定義了乙個事件處理函式(salaryhandler()),並用+=將其與事件聯絡起來,從而使事件觸發的時候能夠呼叫我這個方法(在本例中也就是列印一行字啦)。值得注意的一點是,事件處理函式的方法簽名要與**的方法簽名相同,這是非常重要的一點。

下面將這個例子改造一下,事件引數資訊,用以完善事件機制。

using

system;

using

system.collections.generic;

using

system.text;

using

system.threading;

namespace

eventdemo}}

//class

public

class myeventargs : eventargs //

定義訊息引數類

//因為是readonly的,所以只有建構函式可以設定

//set }

public myeventargs(double

_salary)

}//class

public

class

humanresource

",e._salary); //

只是列印一行字而已}

public

static

void

main()}}

//class

}

在這個例子中,我們要注意的乙個地方就是事件處理函式的簽名要和**的簽名一致。還有要注意的就是:

1. 委託一定要在所有類的外面,在乙個namespace中定義,它的本質也是乙個類。

2. 事件的定義和觸發事件的方法(不是觸發事件)要在publisher中定義。

3. 事件的處理函式,要定義在subscriber中

4. 事件的引數,是在同乙個namespace中的乙個類,是乙個引數類。

5. 事件的註冊,和事件觸發,可以再任何的地方,只要能同時訪問兩個類的例項。(在publisher或者subscriber中當然算是能訪問自己的例項,類似this)

有時間看看這個:

c 事件機制

c 事件機制比mfc 理解起來更為容易。記錄如下。理解c 的事件機制,需要理解事件的三方,事件產生方,事件接收方,和事件本身的資料。下面直接參照網上的乙個例子來說明這三方。假設乙個溫度監測器,監測加熱爐的溫度,當溫度到達100度的時候報警。在這個例子中,事件本身是監測溫度,事件發生方是加熱爐,事件接...

C 事件機制

在所有關於c 事件機制的介紹中,我更傾向於發布者 訂閱者 publisher subscriber 這種描述。理解事件機制並不是一件容易的事情,它所涉及的思想值得我們好好去研究。本文資源來自 c 與.net技術平台實戰演練 中國青年出版社 談到事件,我們涉及到兩個角色 事件發布者 publisher...

C 的事件機制

c 的事件機制是基於委託實現的。實現乙個事件,要先定義乙個委託型別 class1 然後我們可以使用 和 註冊 移除事件 class1.event1 new mydelegate new myeventargs 在class中引發事件時最好這樣 class1 如果不想宣告自己的委託型別的話,可以使用s...