首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> C# 入門

C# 事件模式詳解:發布訂閱、委托關聯、鍋爐監控實戰

     編輯:C# 入門

C# 事件模式詳解:發布訂閱、委托關聯、鍋爐監控實戰

事件封裝「發生的事情」(用戶操作、系統通知),基於發布-訂閱模式實現組件解耦通信。

核心角色

  • 發布器:包含事件與委托定義,觸發事件通知訂閱者
  • 訂閱器:提供事件處理器,註冊到發布器事件

聲明與觸發流程

// 1. 定義委托類型
public delegate void BoilerLogHandler(string status);
// 2. 基於委托聲明事件
public event BoilerLogHandler BoilerEventLog;
// 3. 觸發事件(保護性調用)
protected void OnBoilerEventLog(string msg) {
    BoilerEventLog?.Invoke(msg);
}

示例 1:簡單計數器事件

public class EventTest {
    public delegate void NumHandler();
    public event NumHandler ChangeNum;
    protected virtual void OnNumChanged() => ChangeNum?.Invoke();
    public void SetValue(int n) { if (value != n) { value = n; OnNumChanged(); } }
}
// 訂閱
EventTest e = new EventTest(5);
e.ChangeNum += () => Console.WriteLine("Event Fired!");
e.SetValue(7);  // 觸發

示例 2:鍋爐監控系統

發布器 DelegateBoilerEvent 檢測溫度/壓力,異常時觸發事件。訂閱器 BoilerInfoLogger 將日志寫入文件與控制台:

boilerEvent.BoilerEventLog += Logger;           // 控制台
boilerEvent.BoilerEventLog += filelog.Logger;   // 文件
boilerEvent.LogProcess();  // 觸發檢測並通知

輸出:Logging Info: Temperature 100 Pressure: 12 Message: O. K

關鍵點

  • 事件本質是委托的受限封裝(只能 +=/-=、Invoke 受限於類內)
  • ?.Invoke() 空條件調用避免無訂閱者時拋異常
  • 多播委托支援多訂閱者
  • 標準事件模式:EventHandler、EventArgs 衍生類
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved