diff --git a/GFramework.Core/Events/PriorityEvent.cs b/GFramework.Core/Events/PriorityEvent.cs index 7abcc1f..8704267 100644 --- a/GFramework.Core/Events/PriorityEvent.cs +++ b/GFramework.Core/Events/PriorityEvent.cs @@ -18,6 +18,11 @@ public class PriorityEvent : IEvent /// private readonly List _handlers = new(); + /// + /// 保护处理器集合的并发访问 + /// + private readonly object _syncRoot = new(); + /// /// 标记事件是否已被处理(用于 UntilHandled 传播模式) /// @@ -52,10 +57,13 @@ public class PriorityEvent : IEvent public IUnRegister Register(Action onEvent, int priority) { var handler = new EventHandler(onEvent, priority); - _handlers.Add(handler); + lock (_syncRoot) + { + _handlers.Add(handler); - // 按优先级降序排序(高优先级在前) - _handlers.Sort((a, b) => b.Priority.CompareTo(a.Priority)); + // 按优先级降序排序(高优先级在前) + _handlers.Sort((a, b) => b.Priority.CompareTo(a.Priority)); + } return new DefaultUnRegister(() => UnRegister(onEvent)); } @@ -66,7 +74,10 @@ public class PriorityEvent : IEvent /// 需要被注销的事件处理方法 public void UnRegister(Action onEvent) { - _handlers.RemoveAll(h => h.Handler == onEvent); + lock (_syncRoot) + { + _handlers.RemoveAll(h => h.Handler == onEvent); + } } /// @@ -78,10 +89,13 @@ public class PriorityEvent : IEvent public IUnRegister RegisterWithContext(Action> onEvent, int priority = 0) { var handler = new ContextEventHandler(onEvent, priority); - _contextHandlers.Add(handler); + lock (_syncRoot) + { + _contextHandlers.Add(handler); - // 按优先级降序排序(高优先级在前) - _contextHandlers.Sort((a, b) => b.Priority.CompareTo(a.Priority)); + // 按优先级降序排序(高优先级在前) + _contextHandlers.Sort((a, b) => b.Priority.CompareTo(a.Priority)); + } return new DefaultUnRegister(() => UnRegisterContext(onEvent)); } @@ -92,7 +106,10 @@ public class PriorityEvent : IEvent /// 需要被注销的事件处理方法 public void UnRegisterContext(Action> onEvent) { - _contextHandlers.RemoveAll(h => h.Handler == onEvent); + lock (_syncRoot) + { + _contextHandlers.RemoveAll(h => h.Handler == onEvent); + } } /// @@ -172,8 +189,7 @@ public class PriorityEvent : IEvent /// 事件参数 private void TriggerHighest(T t) { - var normalSnapshot = _handlers.ToArray(); - var contextSnapshot = _contextHandlers.ToArray(); + var (normalSnapshot, contextSnapshot) = CreateSnapshots(); var highestPriority = GetHighestPriority(normalSnapshot, contextSnapshot); if (highestPriority != int.MinValue) @@ -191,8 +207,7 @@ public class PriorityEvent : IEvent private List<(int Priority, Action? Handler, Action>? ContextHandler, bool IsContext)> MergeAndSortHandlers(T t) { - var normalSnapshot = _handlers.ToArray(); - var contextSnapshot = _contextHandlers.ToArray(); + var (normalSnapshot, contextSnapshot) = CreateSnapshots(); // 使用快照避免迭代期间修改 return normalSnapshot .Select(h => (h.Priority, Handler: (Action?)(() => h.Handler.Invoke(t)), @@ -260,7 +275,18 @@ public class PriorityEvent : IEvent /// 监听器总数量 public int GetListenerCount() { - return _handlers.Count + _contextHandlers.Count; + lock (_syncRoot) + { + return _handlers.Count + _contextHandlers.Count; + } + } + + private (EventHandler[] NormalHandlers, ContextEventHandler[] ContextHandlers) CreateSnapshots() + { + lock (_syncRoot) + { + return (_handlers.ToArray(), _contextHandlers.ToArray()); + } } ///