C# 事件系统(二)
标签: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
评论