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
step2:声明事件
public event EventHandler
在类内部通过 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
public event EventHandler
上位机通信中的真实 EventHandler 模板(你可直接封装)
串口模块事件模板
public event EventHandler
public event EventHandler
public event EventHandler Connected;
public event EventHandler Disconnected;
TCP 模块事件模板
public event EventHandler
public event EventHandler
public event EventHandler ClientConnected;
public event EventHandler ClientDisconnected;
Modbus 通信事件模板
public event EventHandler
public event EventHandler
上位机几乎全部依赖事件来「通知 UI」。
浙公网安备 33010602011771号