C#事件
事件基本上都是就像的按鍵,點擊,鼠標移動等,或者一些事件等生成的係統通知用戶操作。應用程序需要發生時響應事件。例如,中斷。事件被用於進程間通信。
使用委托和事件
該事件被聲明,並提出在一個類中,並使用相同的類或其他類中委托事件處理程序相關聯。包含事件類用於發布事件。這就是所謂的發布者類。接受本次活動的一些其他類稱為訂閱類。事件使用的發布者- 訂閱模式。
發布者是一個對象,它包含事件和委托的定義。事件的委托關聯也被定義在此對象。發布者類對象調用事件,並將其通知給其他對象。
訂閱者是接受的事件,並提供事件處理程序的對象。在發布者類委托調用訂戶類的方法(事件處理)。
聲明事件
要聲明一個類的內部事件,首先委托類型的事件必須聲明。例如,
public delegate void BoilerLogHandler(string status);
接下來,事件本身被聲明,使用事件關鍵字:
//Defining event based on the above delegate public event BoilerLogHandler BoilerEventLog;
上麵的代碼定義了一個名為 BoilerLogHandler 和 BoilerEventLog的事件,它調用委托時,它引發委托處理。
示例 1:
using System; namespace SimpleEvent { using System; public class EventTest { private int value; public delegate void NumManipulationHandler(); public event NumManipulationHandler ChangeNum; protected virtual void OnNumChanged() { if (ChangeNum != null) { ChangeNum(); } else { Console.WriteLine("Event fired!"); } } public EventTest(int n ) { SetValue(n); } public void SetValue(int n) { if (value != n) { value = n; OnNumChanged(); } } } public class MainClass { public static void Main() { EventTest e = new EventTest(5); e.SetValue(7); e.SetValue(11); Console.ReadKey(); } } }
讓我們編譯和運行上麵的程序,這將產生以下結果:
Event Fired! Event Fired! Event Fired!
示例 2:
本實施例提供了一種熱水鍋爐係統中的簡單的應用程序進行故障排除。當維護工程師檢查鍋爐,鍋爐的溫度和壓力被自動地記錄到一起維護工程師標記備注的日誌文件。
using System; using System.IO; namespace BoilerEventAppl { // boiler class class Boiler { private int temp; private int pressure; public Boiler(int t, int p) { temp = t; pressure = p; } public int getTemp() { return temp; } public int getPressure() { return pressure; } } // event publisher class DelegateBoilerEvent { public delegate void BoilerLogHandler(string status); //Defining event based on the above delegate public event BoilerLogHandler BoilerEventLog; public void LogProcess() { string remarks = "O. K"; Boiler b = new Boiler(100, 12); int t = b.getTemp(); int p = b.getPressure(); if(t > 150 || t < 80 || p < 12 || p > 15) { remarks = "Need Maintenance"; } OnBoilerEventLog("Logging Info: "); OnBoilerEventLog("Temparature " + t + " Pressure: " + p); OnBoilerEventLog(" Message: " + remarks); } protected void OnBoilerEventLog(string message) { if (BoilerEventLog != null) { BoilerEventLog(message); } } } // this class keeps a provision for writing into the log file class BoilerInfoLogger { FileStream fs; StreamWriter sw; public BoilerInfoLogger(string filename) { fs = new FileStream(filename, FileMode.Append, FileAccess.Write); sw = new StreamWriter(fs); } public void Logger(string info) { sw.WriteLine(info); } public void Close() { sw.Close(); fs.Close(); } } // The event subscriber public class RecordBoilerInfo { static void Logger(string info) { Console.WriteLine(info); }//end of Logger static void Main(string[] args) { BoilerInfoLogger filelog = new BoilerInfoLogger("e:\boiler.txt"); DelegateBoilerEvent boilerEvent = new DelegateBoilerEvent(); boilerEvent.BoilerEventLog += new DelegateBoilerEvent.BoilerLogHandler(Logger); boilerEvent.BoilerEventLog += new DelegateBoilerEvent.BoilerLogHandler(filelog.Logger); boilerEvent.LogProcess(); Console.ReadLine(); filelog.Close(); }//end of main }//end of RecordBoilerInfo }
讓我們編譯和運行上麵的程序,這將產生以下結果:
Logging info: Temperature 100 Pressure 12 Message: O. K