c#中事件总线的简单实现

最近在看Prism源码,统筹处理整个程序中的事件用到的是IEventAggregator接口。
这里简化一下,很典型的观察者模式学习资料。
EventBase.cs

    public abstract class EventBase
    {
    	// List中维护了所有的监听对象,这里的监听者具体表现为Action
        private readonly List<Action> m_subscriptions = new List<Action>();

        public void Subscribe(Action action)
        {
            m_subscriptions.Add(action);
        }

        public void Unsubscribe(Action action)
        {
            m_subscriptions.Remove(action);
        }

        public void Publish()
        {
            foreach (var action in m_subscriptions)
            {
                action();
            }
        }
    }

PubEvent.cs

    public class PubEvent : EventBase
    {
    }

EventBus.cs

    public class EventBus
    {
        private EventBus() { }
		// 使用静态变量,保证每一种事件类型即使被调用多次,也还是同一个实例
        private static readonly Dictionary<Type, EventBase> m_events = new Dictionary<Type, EventBase>();

        public static TEventType GetEvent<TEventType>() where TEventType : EventBase, new()
        {
            lock (m_events)
            {
                EventBase existingEvent = null;
                if (!m_events.TryGetValue(typeof(TEventType), out existingEvent))
                {
                    TEventType newEvent = new TEventType();
                    m_events[typeof(TEventType)] = newEvent;

                    return newEvent;
                }
                else
                {
                    return (TEventType)existingEvent;
                }
            }
        }
    }

使用:

    internal class Program
    {
        static void Main(string[] args)
        {
            var pubEvent = EventBus.GetEvent<PubEvent>();

            Console.WriteLine("注册");
            pubEvent.Subscribe(Say);
            Console.WriteLine("注册");
            pubEvent.Subscribe(Cry);
            pubEvent.Publish();

            Console.WriteLine("注销");
            pubEvent.Unsubscribe(Say);
            pubEvent.Publish();

            Console.ReadLine();
        }

        private static void Say()
        {
            Console.WriteLine("say");
        }

        private static void Cry()
        {
            Console.WriteLine("cry");
        }
    }

输出结果:

注册
注册
say
cry
注销
cry
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
消息总线是一种用于在应用程序实现组件之间通信的模式。在WinForm应用程序,可以使用C#事件、委托和线程安全的队列来实现消息总线。下面是一个简单的示例代码,演示如何使用消息总线在多个界面和多个线程之间进行通信: ```csharp // 定义一个事件参数类,用于传递消息数据 public class MessageEventArgs : EventArgs { public string Message { get; set; } public MessageEventArgs(string message) { Message = message; } } // 定义一个消息总线类 public static class MessageBus { // 定义一个事件,用于发布消息 public static event EventHandler<MessageEventArgs> MessagePublished; // 定义一个线程安全的队列,用于存储消息 private static ConcurrentQueue<string> messageQueue = new ConcurrentQueue<string>(); // 定义一个定时器,用于定时检查消息队列并发布消息 private static System.Timers.Timer timer = new System.Timers.Timer(100); static MessageBus() { // 启动定时器 timer.Elapsed += Timer_Elapsed; timer.Start(); } private static void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { // 检查消息队列 while (messageQueue.TryDequeue(out string message)) { // 发布消息 MessagePublished?.Invoke(null, new MessageEventArgs(message)); } } // 定义一个静态方法,用于发布消息 public static void Publish(string message) { // 将消息添加到队列 messageQueue.Enqueue(message); } } // 在多个界面订阅消息总线事件 public partial class Form1 : Form { public Form1() { InitializeComponent(); // 订阅消息总线事件 MessageBus.MessagePublished += MessageBus_MessagePublished; } private void MessageBus_MessagePublished(object sender, MessageEventArgs e) { // 在UI线程更新界面 if (InvokeRequired) { Invoke(new Action(() => MessageBus_MessagePublished(sender, e))); } else { // 处理消息 label1.Text = e.Message; } } // 在多个线程发布消息 private void button1_Click(object sender, EventArgs e) { // 启动一个新线程 new Thread(() => { // 发布消息 MessageBus.Publish("Hello, World!"); }).Start(); } } ``` 在上面的示例代码,我们定义了一个`MessageBus`类作为消息总线,其包含一个事件`MessagePublished`和一个线程安全的队列`messageQueue`。在多个界面订阅`MessagePublished`事件,并在事件处理程序更新界面。在多个线程,通过调用`MessageBus.Publish`方法来发布消息。定时器定时检查消息队列并发布消息。这样,我们就可以在多个界面和多个线程之间实现通信。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值