using System; using System.Collections.Generic; using System.Threading.Tasks; namespace Bro.Common.PubSub { /// /// 简单发布/订阅中心 /// public class SimplePubSubCenter : IPubSubCenter { /// /// 订阅主题和订阅者 /// private readonly Dictionary subMap = new Dictionary(); /// /// 订阅事件 /// /// /// /// public bool Subscribe(string tag, Func method) { var sub = new SimpleSubscriber(); // 默认使用hash值设置名称,防止重复 sub.SubscriberName = sub.GetHashCode().ToString(); sub.SubMethod = method; return Subscribe(tag, sub); } /// /// 订阅事件 /// /// /// /// public bool Subscribe(string tag, ISubscriber subscribe) { if (null == tag || null == subscribe) { return false; } if (subMap.ContainsKey(tag)) { var subs = subMap[tag]; return subs.Add(subscribe); } else { var subs = new Subscribers(); if (!subs.Add(subscribe)) { return false; } subMap.Add(tag, subs); return true; } } /// /// 发布事件 /// /// /// /// 是否异步,true:异步 false:同步 public void Publish(string tag, object param1, object param2, bool isAsync = false) { if (null == tag) { return; } // 获取所有tag订阅者 var subs = GetSubscribers(tag); if (null == subs) { return; } var enmtor = subs.GetEnumerator(); if (null == enmtor) { return; } // 通知所有订阅者事件 while (enmtor.MoveNext()) { var cur = enmtor.Current; if (null == cur || null == cur.SubMethod) { continue; } if (!isAsync) { cur.SubMethod(cur, param1, param2); } else { //cur.SubMethod.BeginInvoke(cur, param1, param2, null, null); Task.Run(() => { cur.SubMethod(cur, param1, param2); }); } } } /// /// 获取所有订阅者 /// /// /// public Subscribers GetSubscribers(string tag) { if (!subMap.ContainsKey(tag)) { return null; } return subMap[tag]; } /// /// 获取某个订阅者 /// /// /// /// public ISubscriber GetSubscriber(string tag, string name) { var subs = GetSubscribers(tag); if (null == subs) { return null; } return subs.GetSubscriber(name); } /// /// 移除某个订阅者 /// /// /// /// public bool RemoveSubscriber(string tag, string name) { var subs = GetSubscribers(tag); if (null == subs) { return false; } if (!subs.Rmv(name)) { return false; } if (subs.GetCount() == 0) { subMap.Remove(tag); } return true; } /// /// 移除订阅 /// /// /// /// public bool RemoveSubscriber(string tag, Func method) { var subs = GetSubscribers(tag); if (null == subs) { return false; } if (!subs.Rmv(method)) { return false; } if (subs.GetCount() == 0) { subMap.Remove(tag); } return true; } /// /// 移除某类所有订阅者 /// /// /// public bool RemoveSubscribers(string tag) { var subs = GetSubscribers(tag); if (null == subs) { return false; } subMap.Remove(tag); return true; } //IEnumerable Publish(string tag, object data); //IEnumerable Publish(string tag); //IEnumerable Publish(IPublisher publisher); } /// /// 订阅者集合 /// public class Subscribers { /// /// 订阅者集合 /// private readonly Dictionary subMap = new Dictionary(); /// /// 订阅者集合 /// private readonly List subList = new List(); public Subscribers() { } /// /// 新增订阅者 /// /// /// public bool Add(ISubscriber sub) { if (null == sub || subMap.ContainsKey(sub.SubscriberName)) { return false; } subMap.Add(sub.SubscriberName, sub); subList.Add(sub); return true; } /// /// 移除订阅者 /// /// /// public bool Rmv(ISubscriber sub) { if (null == sub || !subMap.ContainsKey(sub.SubscriberName)) { return false; } subMap.Remove(sub.SubscriberName); subList.Remove(sub); return true; } /// /// 移除订阅者 /// /// /// public bool Rmv(string name) { if (!subMap.ContainsKey(name)) { return false; } var sub = subMap[name]; subMap.Remove(name); subList.Remove(sub); return true; } /// /// 移除订阅者 /// /// /// public bool Rmv(Func method) { var names = new List(); try { foreach (var item in subMap) { if (null == item.Value) { continue; } // 若是相同函数,则移除 if (item.Value.SubMethod == method) { names.Add(item.Key); } } for (int i = 0; i < names.Count; i++) { subMap.Remove(names[i]); } names.Clear(); return true; } catch (Exception ex) { } return false; } /// /// 检察订阅者是否存在 /// /// /// public bool Contains(ISubscriber sub) { if (null == sub || !subMap.ContainsKey(sub.SubscriberName)) { return false; } return true; } /// /// 获取订阅者 /// /// /// public ISubscriber GetSubscriber(string name) { if (!subMap.ContainsKey(name)) { return null; } return subMap[name]; } /// /// 清除所有订阅者 /// public void Clear() { subMap.Clear(); subList.Clear(); } /// /// 获取订阅者枚举 /// /// public IEnumerator GetEnumerator() { return subList.GetEnumerator(); } /// /// 获取订阅者数量 /// /// public int GetCount() { return subMap.Count; } } }