// Thread safe very simple & easy use EventsHub
internal class AppEvents
{
private ConcurrentDictionary<string, List<Action<EventParams>>> _events;
private static AppEvents? _instance;
static readonly object _lock = new object();
private static readonly Lazy<AppEvents> _lz = new Lazy<AppEvents>(() =>
new AppEvents(),
LazyThreadSafetyMode.ExecutionAndPublication);
public static AppEvents INST
{
get
{
//if (_instance == null)
//{
// lock (_lock)
// {
// if (_instance == null) _instance = new AppEvents();
// }
//}
return _lz.Value;
}
}
public AppEvents()
{
_events = new ConcurrentDictionary<string, List<Action<EventParams>>>();
}
public bool Register(string name, Action<EventParams> callback)
{
lock (_lock)
{
if (_events.TryGetValue(name, out var callbacks))
{
if (!callbacks.Contains(callback)) callbacks.Add(callback);
}
else
{
var _nl = new List<Action<EventParams>>(6);
_nl.Add(callback);
_events.TryAdd(name, _nl);
}
return true;
}
}
public void Dispatch(string name, EventParams param)
{
lock (_lock)
{
if (_events.TryGetValue(name, out var callbacks))
{
if (callbacks.Count > 0)
{
for (var i = 0; i < callbacks.Count; i++)
{
callbacks[i].Invoke(param);
}
}
else
{
Console.WriteLine($"Event: {name} no register.");
}
}
}
}
public void Unregister(string name, Action<EventParams> callback)
{
lock (_lock)
{
if (_events.TryGetValue(name, out var callbacks))
{
if (callbacks.Contains(callback)) callbacks.Remove(callback);
Console.WriteLine($"Event {callback.GetMethodInfo().Name} have been removed.");
}
else
{
Console.WriteLine($"Event: {name} do not exist.");
}
}
}
public int Count()
{
lock (_lock)
{
return _events.Count;
}
}
public int Count(string name)
{
lock (_lock)
{
if (_events.TryGetValue(name, out var callbacks))
{
return callbacks.Count;
}
return 0;
}
}
public bool IsRegister(string name)
{
lock (_lock)
{
if (_events.TryGetValue(name, out var callbacks))
{
return callbacks.Count > 0;
}
return false;
}
}
public bool IsRegister(string name, Action<EventParams> callback)
{
lock (_lock)
{
if (_events.TryGetValue(name, out var callbacks))
{
return callbacks.Contains(callback);
}
return false;
}
}
}
线程安全AppEvents
于 2023-05-28 06:09:49 首次发布
文章介绍了如何在Unity3D中构建一个基于C#的事件总线(EventBus)系统。该系统利用接口和弱引用管理事件订阅者,支持不同类型事件的发布和接收,例如RedEvent、GreenEvent和BlueEvent。EventBusHolder组件用于持有EventBus实例,EventReceiver和EventSender分别是事件接收者和发送者,允许游戏对象动态响应不同类型的事件。
摘要由CSDN通过智能技术生成