ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C# 事件系统(二)

2020-01-28 22:52:13  阅读:208  来源: 互联网

标签:Handle hashSet C# 系统 eventMethod 事件 EventMethod events


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

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

     实现起来代码如下.

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

        #region Method
        /// <summary>
        /// 添加事件
        /// </summary>
        /// <param name="eventMethod"></param>
        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<EventMethod>());
                    }
                }
          //添加事件方法到集合中
                if (events.TryGetValue(eventMethod.Handle, out var hashSet))
                    return hashSet.Add(eventMethod);
            }
            return false;
            //throw new Exception($"添加事件{eventMethod.Handle}失败!");
        }
        /// <summary>
        /// 移除事件
        /// </summary>
        /// <param name="eventMethod"></param>
        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之后在补齐触发即可.后面就开始实现事件.

标签:Handle,hashSet,C#,系统,eventMethod,事件,EventMethod,events
来源: https://www.cnblogs.com/kent-apple/p/12239088.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有