.NET Standard 3.1 TCP客户端:如何通过订阅事件传递消息参数
解决方案
要在事件中传递收到的消息,你需要自定义一个继承自EventArgs的类来承载消息数据,然后使用泛型版本的EventHandler<T>定义事件。具体步骤如下:
1. 创建自定义 EventArgs 类
这个类用来封装需要传递的消息:
public class MessageReceivedEventArgs : EventArgs { // 存储收到的消息 public string ReceivedMessage { get; } public MessageReceivedEventArgs(string receivedMessage) { ReceivedMessage = receivedMessage; } }
2. 修改 myTcpClass 中的事件定义与触发逻辑
把原有的EventHandler替换为泛型的EventHandler<MessageReceivedEventArgs>,并在触发事件时传入消息:
/*####################### myTcpClass #######################*/ // 使用泛型事件处理器,关联自定义的EventArgs public event EventHandler<MessageReceivedEventArgs> OnMessageReceived; // 触发事件的方法需要接收消息参数 private void CallOnMessageReceived(string receivedMessage) { var handler = this.OnMessageReceived; // 传递当前实例作为sender,并传入封装好消息的EventArgs handler?.Invoke(this, new MessageReceivedEventArgs(receivedMessage)); }
3. 在主程序中订阅事件并获取消息
订阅时通过自定义EventArgs的属性拿到消息:
/*###################### MAIN PROGRAM ######################*/ myTcpClass myTcp = new myTcpClass(ip:"123.123.123.123", port:22171); // 订阅事件,从e中提取消息 myTcp.OnMessageReceived += (sender, e) => { string receivedMessage = e.ReceivedMessage; // 在这里处理消息... };
补充说明
- 默认的
EventHandler只能传递sender和空的EventArgs,无法携带额外数据,所以必须通过自定义EventArgs类扩展数据传递能力。 - 触发事件时传递
this作为sender,能让订阅者明确知道是哪个对象触发的事件,比传递null更符合.NET事件的设计规范。
内容的提问来源于stack exchange,提问作者Robot Fox
相关产品推荐
相关产品推荐

