C#实现一个安全的事件订阅器

1.解释下什么是事件订阅器

在C#的上下文中,事件订阅器是一种用于处理特定事件的机制。

  1. 事件(Event):事件是在软件应用程序中发生的事物,如按钮被点击、数据被更改等。在C#中,事件是通过使用event关键字声明的委托(delegate)来定义的。DevExpress控件和框架通常会触发各种事件,以便您的应用程序能够对用户的交互或其他系统变化做出响应。
  2. 事件订阅器: 事件订阅器是一个对象,它订阅(或监听)某个事件,并在事件发生时执行相应的操作。

2.事件订阅器有什么作用

通知订阅对象,告知变化发生,并把变化发生时候的数据通知到具体订阅的委托方法中。

3.示例代码

我这边封装了一个全局的事件订阅器,采用一个静态函数的方法来实现全局可以调用,试用一个字段存储当前订阅的消息,防止一个事件多次订阅的问题。

代码如下:

csharp 复制代码
 public static class EventSubscriber
 {
     /// <summary>
     /// 订阅消息字典
     /// </summary>
     private static Dictionary<string, SendMessageHandler> MsgDict = new Dictionary<string, SendMessageHandler>();
     public delegate void SendMessageHandler(object MsgContent);

     /// <summary>
     /// 订阅消息
     /// </summary>
     /// <param name="name">消息唯一名称</param>
     /// <param name="AcceptFunction">接受消息的方法</param>
     /// <exception cref="Exception"></exception>
     public static void SubMsg(string name, SendMessageHandler AcceptFunction)
     {
         if (!MsgDict.ContainsKey(name))
         {
             MsgDict.Add(name, AcceptFunction);
         }
         else
         {
             // throw new Exception("已经有" + name + "名称的订阅");
         }
     }

     /// <summary>
     /// 移除指定订阅消息
     /// </summary>
     /// <param name="name">消息名称</param>
     public static void UnSubMsg(string name)
     {
         if (MsgDict.ContainsKey(name))
         {
             MsgDict.Remove(name);
         }
     }

     /// <summary>
     /// 发送消息
     /// </summary>
     /// <param name="name">消息名称</param>
     /// <param name="msgContent">消息内容</param>
     public static void SendMsg(string name, object msgContent)
     {
         if (MsgDict.ContainsKey(name))
         {
             MsgDict[name].Invoke(msgContent);
         }
     }
 }

使用方法:

订阅消息:

csharp 复制代码
  EventSubscriber.SubMsg("GetDataTable", SendMessageHandler);

当消息通知时候,获得事件传递过来的数据并处理

csharp 复制代码
    public void SendMessageHandler(object MsgContent)
    {
        var data = (DataTable?)MsgContent;
        TableWait = true;
    }
相关推荐
牛肉在哪里4 分钟前
ros2 从零开始28 监听广播C++
开发语言·c++·算法·机器人
techdashen16 分钟前
Cargo 1.94 开发周期全解析
开发语言·后端·rust
charlie11451419125 分钟前
现代C++特性指南——constexpr 构造函数与字面类型
开发语言·c++
北城以北888828 分钟前
虚拟机安装JDK,Tomcat,部署项目
java·开发语言·tomcat
江华森31 分钟前
Python 3 实战教程:从零基础到项目实战
开发语言·python
Wonderful U34 分钟前
Python+Django实战|在线音乐分享平台:音乐上传、歌手专辑管理、在线播放、自定义歌单、收藏点赞、评论互动
开发语言·python·django
小糯米60144 分钟前
JavaScript表达式与运算符
开发语言·javascript·ecmascript
北极星日淘1 小时前
煤炉自动代拍功能开发 | Python 异步任务实现批量下单
开发语言·python·自动化
影寂ldy1 小时前
C# 事件完整学习笔记(发布订阅 + 自定义事件 + 内置 EventHandler)
笔记·学习·c#
体验家1 小时前
体验家 XMPlus 网页端问卷 SDK 技术解析:用几行 JavaScript 实现精准场景触发与防打扰机制
开发语言·前端·javascript