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;
    }
相关推荐
weixin_30777913几秒前
使用C#实现从Hive的CREATE TABLE语句中提取分区字段名和数据类型
开发语言·数据仓库·hive·c#
Xiaok10189 分钟前
解决 Hugging Face SentenceTransformer 下载失败的完整指南:ProxyError、SSLError与手动下载方案
开发语言·神经网络·php
绿草在线11 分钟前
Mock.js虚拟接口
开发语言·javascript·ecmascript
go_bai21 分钟前
Linux环境基础开发工具——(2)vim
linux·开发语言·经验分享·笔记·vim·学习方法
小郝 小郝23 分钟前
【C语言】strstr查找字符串函数
c语言·开发语言
yinhezhanshen28 分钟前
理解rust里面的copy和clone
开发语言·后端·rust
Jtti44 分钟前
PHP在Debian环境上的并发处理能力如何
开发语言·debian·php
时光追逐者1 小时前
在 Blazor 中使用 Chart.js 快速创建数据可视化图表
开发语言·javascript·信息可视化·c#·.net·blazor
独好紫罗兰1 小时前
洛谷题单3-P5718 【深基4.例2】找最小值-python-流程图重构
开发语言·python·算法
小天努力学java1 小时前
【面试题】如何用两个线程轮流输出0-200的值
java·开发语言