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;
    }
相关推荐
大草原的小灰灰14 分钟前
Python基础语法
开发语言·python
泡泡鱼(敲代码中)2 小时前
MySQL基础学习笔记:从数据模型到DDL全掌握
开发语言·数据库·笔记·学习·mysql
唐青枫2 小时前
别只会看日志:C#.NET SOS 调试扩展从 Dump 到内存泄漏排查
c#·.net
潜创微科技3 小时前
IT6520:USB-C 转 MIPI 高集成控制器,DP 1.4a 转 MIPI 单芯片搞定 4K120 显示
c语言·开发语言·低延迟·掌机·联阳
Escalating_xu4 小时前
【System V 信号量】从 P/V 原语到 Builder 封装:写出可控、可清理的进程互斥组件
java·linux·开发语言·jvm
傲世仙尊4 小时前
System V 进程间通信详解:共享内存、消息队列与信号量(CSDN博客)
linux·开发语言·c++
cvby4 小时前
C++11
开发语言·c++
ch.ju5 小时前
Java—idea知识:如何创建新项目
java·开发语言·intellij-idea
Evand J5 小时前
【MATLAB例程,图像滤波降噪12】加权中值滑动窗口滤波(WMF)图像降噪,包含滤波质量评价。附代码下载链接
开发语言·图像处理·人工智能·计算机视觉·matlab·滑动窗口·滤波
Tairitsu_H5 小时前
[C++] C++11类和STL的新特性
开发语言·c++·stl·c++11