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