事件订阅器是一个对象,它订阅(或监听)某个事件,并在事件发生时执行相应的操作,本文主要介绍了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方法,同样注册到妈妈的开饭事件就好了。