C# 事件系统(二)

2021-01-15 15:12

阅读:476

标签:for   ram   eve   sys   var   bool   try   val   简单   

  前面已经说过了大概的设计思路.现在开始实现事件系统.所谓的事件系统,其实是一个事件集合.将事件存放一处统一管理.

  事件是一对多的关系,我也选择了用string表示事件.用HashSet来存储多个委托.那这种Key/Value的集合自然选择字典存储.这里我们还没有讨论委托的具体设计.我们先用一个类EventMethod来代表.

     实现起来代码如下.

    /// 
    /// 事件系统
    /// 
    public class EventSystem
    {
        #region Field
        /// 
        /// 事件容器
        /// 
        private readonly Dictionarystring, HashSet> events = new Dictionarystring, HashSet>();
        #endregion

        #region Method
        /// 
        /// 添加事件
        /// 
        /// 
        public bool Add(EventMethod eventMethod)
        {
            //事件方法集合可能在刚判断存在,但是在另外一个线程中马上被删除.所以这里重试5次
            for (int i = 0; i 5; i++)
            {
                //创建事件方法集合
                if (!events.ContainsKey(eventMethod.Handle))
                {
                    lock (events)
                    {
                        if (!events.ContainsKey(eventMethod.Handle))
                            events.Add(eventMethod.Handle, new HashSet());
                    }
                }
          //添加事件方法到集合中
                if (events.TryGetValue(eventMethod.Handle, out var hashSet))
                    return hashSet.Add(eventMethod);
            }
            return false;
            //throw new Exception($"添加事件{eventMethod.Handle}失败!");
        }
        /// 
        /// 移除事件
        /// 
        /// 
        public void Remove(EventMethod eventMethod)
        {
            if (events.TryGetValue(eventMethod.Handle, out var hashSet))
            {
                hashSet.Remove(eventMethod);
                //移除已经空置的事件方法集合
                if (hashSet.Count 0)
                    events.Remove(eventMethod.Handle);
            }
        }#endregion
    }

  EventMethod中有个属性Hnadle来代表他是哪种事件的委托.这样在添加到实现系统时会将它添加到对应的事件方法集合中.移除同理.

  一个简单的事件容器就设计好了.当然现在还不能触发,我们在设计好EventMethod之后在补齐触发即可.后面就开始实现事件.

C# 事件系统(二)

标签:for   ram   eve   sys   var   bool   try   val   简单   

原文地址:https://www.cnblogs.com/kent-apple/p/12239088.html

上一篇:.net core 中api 模型验证

下一篇:C# 7


评论


亲,登录后才可以留言!