C# Development | 事件 ( Event ) 及委派事件 ( EventHandler ) 的用法
如何使用事件 ( Event ) 及委派事件 ( EventHandler ) 讓程式執行完畢後主動通知而不用一直詢問狀態。
前言
目前在寫設備控制的 SDK ,而事件 ( Event ) 十分的好用,假設要執行計算較繁瑣或是需要花較多時間處理的工作可以丟給其他執行緒處理,等其他執行緒處理完再觸發 event 通知說處理完畢即可。
另一種常用的時機是寫使用者介面 ( User interface ) 的時候,因為通常使用主執行緒來控制畫面 ( Form ),而副執行緒來處理指令或是其他動作來避免畫面延遲甚至是卡住,所以當副執行緒完成任務後觸發事件來告知主執行緒該在畫面上顯示什麼資訊十分的常用。
概念簡介
主要的概念就像是老闆( 主執行緒 )叫你這個員工( 副執行緒 )去幫忙跑腿買東西,當你去把東西買回來之後,不是直接衝進老闆辦公室跟老闆說你完成任務了,而事先告知秘書(承接委派的方法)說你完成了。
- MSDN 說明連結👇
Example
這個 Example 主要是讓副執行緒去執行一個計數的動作,等記數到一定值後觸發 event。而主程式接收到這個 event 後用 MessageBox 顯示接收到 event。
1. 建立一個 Windows Form Application 專案 ( 本文是用 Visual Studio 2015, .NET Framework 4.5.2 )。
2. 需要 Using System.Threading。接著建立一個 class,內部需要宣告一個 public 的委派好讓外部可以承接、一個 public event 當計數完畢後觸發,以及計數的方法。程式碼如下。
3. 在主執行緒中宣告一副執行緒,然後在 Form1 建構子中先將 CountingClass 中的 event 用委派 DelegateFinish 與要承接的方法 ( HandleEventFunction ) 連接起來。這樣當觸發 eventFinished 這個事件時就會去執行 HandleEventFunction 這個方法。
4. 完成上面三步就大功告成了!以下是完整程式碼。
執行結果
當計數完畢後就跳出 MessageBox 顯示副程式已經完成計數工作了。Done ~
尾聲
其實使用到現在會覺得將委派傳遞值可以使用 object 這樣靈活度較高,不管是什麼類別的資料等傳遞完再轉型,這樣就可以變成任何人的形狀呢!