1. 程式人生 > >C#中的事件驅動機制如何理解!

C#中的事件驅動機制如何理解!

“事件驅動機制”裡的事件和c#中的event不是一回事。就像java和c++裡沒有event這個關鍵字並且不用delegate。但是它們在處理GUI程式時卻都是用事件驅動機制來完成。
從機制上講,事件就是你幹了什麼,你點選了一個button,選擇了一個下拉選單,點選關閉按鈕。那麼這個時候程式該怎麼反應呢?這就看你的事件(或者說動作)有誰關心和誰關聯。
拿button為例,它有一個事件叫單擊,當單擊發生時,button會發佈一個訊息“我被單擊了”;在這之前關心這個問題的類會跟這個事件註冊一下,就是說我訂閱你的訊息,當你事件發生時,這個訊息要給我知道。而當訂閱者知道事情發生了它就會採取相應的處理也就是呼叫自己預先寫好的事件處理方法。
拿現實為例,出版社會發行報紙,而一個事件發生(比方某煤礦瓦斯爆炸)它會出現在報紙上,這就是一個訊息;而如果你想知道發生了什麼,你就要訂閱報紙,這樣每有訊息,都會把報紙送到你家的郵箱;不同的人收到報紙他就會有不同的反應做出不同的處理,比方家人在那個煤礦的人和投資了那個煤礦的人就會做不同反應。
在實現上,c#是用委託做的,事件是一個特殊的委託,不用事件也能完成,但是可能會出現問題,就是有人可以繞過你這個事件發生而使用委託即事件沒發生卻可以從後臺呼叫你的事件處理方法,為了限制這個行為採用關鍵字event來修飾委託或者說建立了一個“事件”的概念。
而在java中,是用Listener來做的,你一個事件源負責釋出訊息,而關心它的類會有一個Listener並在內部編寫事件處理方法,而在事件源中addActionListener就是把外部的一個關心者註冊起來,表示別人關心你訂閱了你的訊息。

相關推薦

C#事件驅動機制如何理解

“事件驅動機制”裡的事件和c#中的event不是一回事。就像java和c++裡沒有event這個關鍵字並且不用delegate。但是它們在處理GUI程式時卻都是用事件驅動機制來完成。 從機制上講,事件就是你幹了什麼,你點選了一個button,選擇了一個下拉選單,點選關閉

事件驅動機制在微控制器軟體的應用

一、Windows的事件驅動機制     在Windows系統中,程式的設計圍繞事件驅動來進行。當物件有相關的事件發生時(如按下滑鼠鍵),物件產生一條特定的標識事件發生的訊息,訊息被送入 訊息佇列,或不進入佇列而直接傳送給處理物件,主程式負責組織訊息佇列,將訊息傳送給相應的

Redis原始碼解析:13Redis事件驅動機制

         Redis中,處理網路IO時,採用的是事件驅動機制。但它沒有使用libevent或者libev這樣的庫,而是自己實現了一個非常簡單明瞭的事件驅動庫ae_event,主要程式碼僅僅400行左右。 沒有選擇libevent或libev的原因大概在於,這些庫為了

C#訊息處理機制(事件與委託)

編寫過Windows桌面應用程式的人都知道,微軟的Windows作業系統與應用程式之間的通訊絕大部分是基於訊息迴圈機制的。在VC++中,程式使用GetMessage,TranslateMessage,DispatchMessage語句從訊息佇列中獲取訊息,轉換訊息並且將訊息分發到目標視窗的過程函式,並由過程

C#事件的動態調用實現方法

ear too new std 實現 bject multicast using pad 本文實例講述了C#動態調用事件的方法。一般來說,傳統的思路是,通過Reflection.EventInfo獲得事件的信息,然後使用GetRaiseMethod方法獲得事件被觸發後調用

180609-Spring之事件驅動機制的簡單使用

extend listener 支持 ati 關註 如果 ace publisher rip 文章鏈接:https://liuyueyi.github.io/hexblog/hexblog/2018/06/09/180609-Spring之事件驅動機制的簡單使用/ Spr

c++虛擬函式的理解

虛擬函式的作用,事實上就是實現了多型性,就是實現以共同的方法,但因個體差異而採用不同的策略。下面有程式碼例項來描述: class A{ public: void print(){ cout<<”This is A”<<endl;} }; class B:publ

c++this指標的理解(轉載:苦澀的茶 ——產品開發 C++類this指標的理解

先要理解class的意思。class應該理解為一種型別,象int,char一樣,是使用者自定義的型別。用這個型別可以來宣告一個變數,比如int x, myclass my等等。這樣就像變數x具有int型別一樣,變數my具有myclass型別。理解了這個,就好解釋this了,m

C++友元的理解

1.友元成員函式 先上程式碼 #include <iostream>      class B;//由於類B的定義在類A之後,所以用到類B的宣告時,使用前向宣告      class A{   private:       void func()       {

C++建構函式的理解

程式執行的情況為: 10 25 54↙  (從鍵盤輸入新值賦給t1的資料成員) 10:25:54    (輸出t1的時、分、秒值)  0:0:0   (輸出t2的時、分、秒值)在類中定義了建構函式Time,它和所在的類同名。在建立物件時自動執行建構函式,它的作用是對該物件中的資料成員賦初值0。請不要誤認為是在

C++this指標的理解和用法

關於this指標的一個精典回答: 當你進入一個房子後,你可以看見桌子、椅子、地板等,但是房子你是看不到全貌了。對於一個類的例項來說,你可以看到它的成員函式、成員變數,但是例項本身呢?this是一個指標,它時時刻刻指向你這個例項本身。 個人理解: (ps:class類就好比這

libevent:一個在網路伺服器事件驅動開發庫

Libevent 是一個基於事件觸發的網路庫。它提供一種機制,即當某個具體事件發生在一個檔案描述符上或已經達到超時時,來執行某一個回撥函式。此外,它也支援訊號或定時器事件的回撥。 Libevent 是為了取代在事件驅動的網路服務中的事件迴圈。應用程式只需要呼叫event_dispatch() 函式,然後動

事件驅動機制和訊息驅動機制

事件:按下滑鼠,按下鍵盤,按下游戲手柄,將U盤插入USB介面,都將產生事件。比如說按下滑鼠左鍵,將產生滑鼠左鍵被按下的事件。 訊息:當滑鼠被按下,產生了滑鼠按下事件,windows偵測到這一事件的發生,隨即發出滑鼠被按下的訊息到訊息佇列中,這訊息附帶了一系列相關的事件資訊,比如滑鼠哪個鍵被按

C++字串常量的理解

/* 常量儲存總結:1.區域性變數儲存在棧中,棧中的記憶體隨著定義所在區間的結束自動釋放;2.new申請的記憶體在堆中,堆中記憶體需要手動free,否則它會一直存在直到程式結束;3.全域性變數、靜態變

RecyclerViewViewHolder重用機制理解(解決圖片錯亂和閃爍問題)

對於使用ViewHolder引起的圖片錯亂問題,相信大部分人都有遇到過,我也一樣,對於解決方法也有所瞭解,但一直都是知其然不知其所以然。 所以,這次直接把ViewHolder的工作原理,通過簡單的demo程式碼來驗證一次,驗證後對於圖片錯亂和閃爍這種問題的成因就很清楚了。 下面先上一副圖 這幅圖

<C++學習二十>C++函式過載的理解(未完待續)

摘要: 本篇部落格僅作為筆記,如有侵權,請聯絡,立即刪除(網上找部落格學習,然後手記筆記,因紙質筆記不便儲存,所以儲存到網路筆記)。   我們平時寫程式碼中會用到幾個函式但是他們的實現功能相同,但是有些細節卻不同。例如:交換兩個數的其中包括(int,float,char,double)這些型別。這C語言中我

C++的類的理解

物件: 1.物件是指被抽象描述的某個實體 2.一個物件包含了實體的特徵和實體的功能 3.物件=資料+功能 類: 1.類是具有相同特徵和功能的物件集合; 學生集合--->學生類; 整數集合---

Qt的事件驅動機制與eventfd

簡介 Qt是一個事件驅動的GUI框架,那麼,這個“事件驅動”說的是什麼呢?以我的理解就是:對於UI執行緒,除了初始化程式碼和主迴圈本身之外,跑在CPU上的每條指令,要麼是為了接收事件,要麼就是某個事件觸發的,這個事件可以直接來源於使用者操作,也可以間接來源於使

關於C++類的一些理解

類是面向物件的一個概念,而C++正是面向物件的一門語言,類其實可以說是一種使用者自定義的資料型別,可以類比基本的資料型別,比如int,long,double等等,只不過基本資料型別已經定義好了,可以直接拿來用,而類則需

C++sscanf的初級理解

吃飽了沒事,翻了翻網上的一些程式面試題,看到了C++這麼一道題void DoSomeThing(char* p) { char str[16]; int n; assert(NULL != p); sscanf(p, "%s%d", str, n); if (0