自定义事件模式(EventHandler)

Posted on 2025-11-21 09:57  懒得理  阅读(15)  评论(0)    收藏  举报

1、什么是事件Event/EventHandler?
事件就是一种"发布-订阅机制"
某模块中发生某件事->触发通知->其他模块就可以收到消息
C#中事件一般使用EventHandler委托:
EventHandler(无自定义数据,只传sender+EventArgs)
EventHandler(带自定义数据)
2、标准EventHandler事件模式
C#官方推荐写法:
事件触发->方法名:Onxxx
事件声明->EventHandler / EventHandler
事件参数->XxxEventArgs : EventArgs
3、最推荐写法(标准模式)
继承 EventArgs,用于封装要传递给事件处理程序的数据(这里是 byte[] Data)。
Step1:定义EventArgs(如需传数据)
public class DataReceiveEventArgs : EventArgs
{
public byte[]Data{get;}
public DataReceiveEventArgs(byte[] data){
Data = data;
}
}

使用 EventHandler 泛型委托声明一个名为 DataReceived 的事件。
step2:声明事件
public event EventHandler DataReceived;

在类内部通过 OnDataReceived 方法安全地调用(触发)该事件。
step3:触发事件
protected virtual void OnDataReceived(byte[]data){
DataReceived?.Invoke(this,new DataReceivedEventArgs(data));
}

其他代码(比如 UI 或业务逻辑)通过 += 订阅这个事件,并在事件触发时执行回调。
step4:使用事件(订阅)
myClient.DataReceived+=(s,e)=>{
cw("收到"+BitConverter.Tostring(e.Data));
};
(s,e)=>void Handler(object sender, EventArgs e)
s(即 sender):触发事件的对象。在这里就是 myClient 本身(因为 OnDataReceived 中传的是 this)。
e(即 EventArgs):携带事件数据的对象。这里就是 DataReceiveEventArgs 实例,你可以通过 e.Data 获取数据。

事件 = 上位机通信最佳通知方式

实际开发 99% 使用 EventHandler
EventHandler 用自定义 EventArgs:
public event EventHandler DataReceived;

上位机通信中的真实 EventHandler 模板(你可直接封装)
串口模块事件模板
public event EventHandler SerialDataReceived;
public event EventHandler SerialError;
public event EventHandler Connected;
public event EventHandler Disconnected;

TCP 模块事件模板
public event EventHandler TcpDataReceived;
public event EventHandler TcpError;
public event EventHandler ClientConnected;
public event EventHandler ClientDisconnected;

Modbus 通信事件模板
public event EventHandler RegisterUpdated;
public event EventHandler ModbusError;
上位机几乎全部依赖事件来「通知 UI」。

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3