[bug] [6155] 条件系统防止同一事件递归处理

main
YuShunyao 2026-05-28 13:38:34 +08:00
parent 52df52ed15
commit c6d728172a
1 changed files with 13 additions and 0 deletions

View File

@ -86,6 +86,11 @@ namespace Framework.Condition
/// </summary>
private Stack<EventName> stackExEventName = new(MAX_EX_EVENT_COUNT);
/// <summary>
/// 追踪正在处理的事件,防止同一事件递归重入
/// </summary>
private HashSet<EventName> _processingEvents = new();
/// <summary>
/// 为减少GC分配
/// </summary>
@ -115,6 +120,7 @@ namespace Framework.Condition
dicAllContitionInfo.Clear();
dicConditionInfo.Clear();
setConditionInfoPool.Clear();
_processingEvents.Clear();
setTempSignal.Clear();
}
@ -339,6 +345,10 @@ namespace Framework.Condition
private void OnSignalSend(EventName signalName)
{
// 防止同一事件递归处理:如果该事件正在处理中,直接跳过
if (!_processingEvents.Add(signalName))
return;
stackExEventName.Push(signalName); // 防止死循环
if (stackExEventName.Count >= MAX_EX_EVENT_COUNT)
{
@ -349,12 +359,14 @@ namespace Framework.Condition
}
DebugUtil.LogError($"条件系统递归触发超过{MAX_EX_EVENT_COUNT - 1}次,请检查逻辑:{log}");
stackExEventName.Pop();
_processingEvents.Remove(signalName);
return;
}
if (!dicConditionInfo.TryGetValue(signalName, out Dictionary<int, ConditionInfo> dicInfo))
{
stackExEventName.Pop();
_processingEvents.Remove(signalName);
return;
}
@ -371,6 +383,7 @@ namespace Framework.Condition
RecycleTempConditionInfos(listTemp);
stackExEventName.Pop();
_processingEvents.Remove(signalName);
}
private List<ConditionInfo> GetTempConditionInfos()