线程安全AppEvents

文章介绍了如何在Unity3D中构建一个基于C#的事件总线(EventBus)系统。该系统利用接口和弱引用管理事件订阅者,支持不同类型事件的发布和接收,例如RedEvent、GreenEvent和BlueEvent。EventBusHolder组件用于持有EventBus实例,EventReceiver和EventSender分别是事件接收者和发送者,允许游戏对象动态响应不同类型的事件。
摘要由CSDN通过智能技术生成
// 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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值