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

事件订阅器是一个对象,它订阅(或监听)某个事件,并在事件发生时执行相应的操作,本文主要介绍了C#实现一个安全的事件订阅器的相关知识,感兴趣的可以了解下

目录
1.解释下什么是事件订阅器
2.事件订阅器有什么作用
3.示例代码

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

事件(Event):事件是在软件应用程序中发生的事物,如按钮被点击、数据被更改等。在C#中,事件是通过使用event关键字声明的委托(delegate)来定义的。DevExpress控件和框架通常会触发各种事件,以便您的应用程序能够对用户的交互或其他系统变化做出响应。

事件订阅器: 事件订阅器是一个对象,它订阅(或监听)某个事件,并在事件发生时执行相应的操作。


2.事件订阅器有什么作用
通知订阅对象,告知变化发生,并把变化发生时候的数据通知到具体订阅的委托方法中。


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

代码如下:


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);

   //调用时类似以下两种方式都可以

     //     MsgDict["name"].Invoke("object");
        //    MsgDict["name"]("object");
        }
    }
}
使用方法:

订阅消息:
EventSubscriber.SubMsg("GetDataTable", SendMessageHandler);
当消息通知时候,获得事件传递过来的数据并处理
public void SendMessageHandler(object MsgContent)
{
    var data = (DataTable?)MsgContent;
    TableWait = true;
}

/*****************************

C#事件订阅发布实现原理详解

文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  我们用一个简单的例子,来说明一下这种消息传递的机制。

  有一家三口,妈妈负责做饭,爸爸和孩子负责吃。。。将这三个人,想象成三个类。

  妈妈有一个方法,叫做“做饭”。有一个事件,叫做“开饭”。做完饭后,调用开发事件,发布开饭消息。

  爸爸和孩子分别有一个方法,叫做“吃饭”。

  将爸爸和孩子的“吃饭”方法,注册到妈妈的“开饭”事件。也就是,订阅妈妈的开饭消息。让妈妈做完饭开饭时,发布吃饭消息时,告诉爸爸和孩子一声。

  这种机制就是C#中的,订阅发布。下面我们用代码实现:


class Program
  {
    public static void Main(string[] args)
    {
      //实例化对象
      Mom mom = new Mom();
      Dad dad = new Dad();
      Child child = new Child();
 
      //将爸爸和孩子的Eat方法注册到妈妈的Eat事件
      //订阅妈妈开饭的消息
      mom.Eat += dad.Eat;
      mom.Eat += child.Eat;
 
      //调用妈妈的Cook事件
      mom.Cook();
 
      Console.Write("Press any key to continue . . . ");
      Console.ReadKey(true);
    }
  }
 
  public class Mom
  {
    //定义Eat事件,用于发布吃饭消息
    public event Action Eat;
 
    public void Cook()
    {
      Console.WriteLine("妈妈 : 饭好了");
      //饭好了,发布吃饭消息
      Eat?.Invoke();
    }
  }
 
  public class Dad
  {
    public void Eat()
    {
      //爸爸去吃饭
      Console.WriteLine("爸爸 : 吃饭了。");
    }
  }
 
  public class Child
  {
    public void Eat()
    {
      //熊孩子LOL呢,打完再吃
      Console.WriteLine("孩子 : 打完这局再吃。");
    }
  }
  运行结果:

  当爷爷奶奶来做客了怎么办呢?和爸爸孩子一样,写个Eat方法,同样注册到妈妈的开饭事件就好了。

  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值