在C#的上下文中,事件订阅器是一种用于处理特定事件的机制。
通知订阅对象,告知变化发生,并把变化发生时候的数据通知到具体订阅的委托方法中。
我这边封装了一个全局的事件订阅器,采用一个静态函数的方法来实现全局可以调用,试用一个字段存储当前订阅的消息,防止一个事件多次订阅的问题。
代码如下:
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);
}
}
}
使用方法:
订阅消息:
EventSubscriber.SubMsg("GetDataTable", SendMessageHandler);
当消息通知时候,获得事件传递过来的数据并处理
public void SendMessageHandler(object MsgContent)
{
var data = (DataTable?)MsgContent;
TableWait = true;
}