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;
    }
相关推荐
lly202406几秒前
XQuery 选择和过滤
开发语言
测试工程师成长之路9 分钟前
Serenity BDD 框架:Java + Selenium 全面指南(2026 最新)
java·开发语言·selenium
czxyvX16 分钟前
017-AVL树(C++实现)
开发语言·数据结构·c++
你真是饿了33 分钟前
1.C++入门基础
开发语言·c++
天天进步201537 分钟前
Python全栈项目:实时数据处理平台
开发语言·python
Tipriest_37 分钟前
Python中is关键字详细说明,比较的是地址还是值
开发语言·python
sheji341639 分钟前
【开题答辩全过程】以 基于Python的餐饮统计系统的设计和实 现为例,包含答辩的问题和答案
开发语言·python
elseif12340 分钟前
【C++】并查集&家谱树
开发语言·数据结构·c++·算法·图论
catchadmin40 分钟前
2026 年 PHP 前后端分离后台管理系统推荐 企业级方案
开发语言·php
LGL6030A1 小时前
Java学习历程26——线程安全
java·开发语言·学习