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;
    }
相关推荐
m0_5474866610 小时前
《JavaScript核心原理 》全套PPT课件2026
开发语言·javascript·ecmascript
MC皮蛋侠客10 小时前
Tauri 2.x 系列(五):调用系统 API——官方插件、Rust crate 与原生能力
开发语言·后端·rust
布莱克60511 小时前
软中断和硬中断的区别
开发语言·操作系统
whcyhhh11 小时前
头歌实践教学平台:数据科学与大数据技术导论(十二)
大数据·开发语言·python·数据清洗
lzhdim12 小时前
13、JavaScript事件循环机制 - JavaScript学习系列文章
开发语言·前端·javascript·学习·ecmascript
吴可可12312 小时前
多段线局部约束缩放实现
c#
zbyyd13 小时前
Linux 多线程:互斥锁 &amp; 信号量
linux·c语言·开发语言·网络
wuyk55513 小时前
从零吃透Modbus通信|第3章:STM32 Modbus RTU主机
服务器·开发语言·网络·数据结构·stm32·单片机·嵌入式硬件
one31214 小时前
高精度MEMS电容式倾角传感器:原理、结构与Python三维可视化
开发语言·python
程序员小八77714 小时前
Go 语言特性
开发语言·后端·golang