From 50c73a7d7ce96bf55360dad955c6f76db6d10689 Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Mon, 2 Mar 2026 21:46:53 +0800 Subject: [PATCH] =?UTF-8?q?fix(pause):=20=E4=BF=AE=E5=A4=8D=E6=9A=82?= =?UTF-8?q?=E5=81=9C=E7=AE=A1=E7=90=86=E5=99=A8=E9=94=80=E6=AF=81=E6=97=B6?= =?UTF-8?q?=E7=9A=84=E5=B9=B6=E5=8F=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在销毁过程中收集暂停组和处理器快照,避免并发修改异常 - 在锁外通知所有之前暂停的组恢复,保持生命周期信号一致性 - 添加异常处理确保单个处理器失败不影响其他处理器的通知 - 修改文件过滤规则以正确包含测试文件路径 --- GFramework.Core/pause/PauseStackManager.cs | 56 +++++++++++++++++++++- deepsource.toml | 7 +-- 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/GFramework.Core/pause/PauseStackManager.cs b/GFramework.Core/pause/PauseStackManager.cs index ff2d5b8..aea4124 100644 --- a/GFramework.Core/pause/PauseStackManager.cs +++ b/GFramework.Core/pause/PauseStackManager.cs @@ -28,6 +28,9 @@ public class PauseStackManager : AbstractContextUtility, IPauseStackManager, IAs if (_disposed) return ValueTask.CompletedTask; + List pausedGroups; + IPauseHandler[] handlersSnapshot; + _lock.EnterWriteLock(); try { @@ -36,6 +39,15 @@ public class PauseStackManager : AbstractContextUtility, IPauseStackManager, IAs _disposed = true; + // 收集所有当前暂停的组 + pausedGroups = _pauseStacks + .Where(kvp => kvp.Value.Count > 0) + .Select(kvp => kvp.Key) + .ToList(); + + // 获取处理器快照 + handlersSnapshot = _handlers.ToArray(); + // 清理所有数据结构 _pauseStacks.Clear(); _tokenMap.Clear(); @@ -48,6 +60,34 @@ public class PauseStackManager : AbstractContextUtility, IPauseStackManager, IAs _lock.ExitWriteLock(); } + // 在锁外通知所有之前暂停的组恢复,保持生命周期信号一致 + foreach (var group in pausedGroups) + { + _logger.Debug($"Notifying handlers of destruction: Group={group}, IsPaused=false"); + + foreach (var handler in handlersSnapshot.OrderBy(h => h.Priority)) + { + try + { + handler.OnPauseStateChanged(group, false); + } + catch (Exception ex) + { + _logger.Error($"Handler {handler.GetType().Name} failed during destruction", ex); + } + } + + // 触发事件 + try + { + OnPauseStateChanged?.Invoke(group, false); + } + catch (Exception ex) + { + _logger.Error($"Event subscriber failed during destruction for group {group}", ex); + } + } + // 释放锁资源 _lock.Dispose(); @@ -422,8 +462,20 @@ public class PauseStackManager : AbstractContextUtility, IPauseStackManager, IAs { _logger.Debug($"Notifying handlers: Group={group}, IsPaused={isPaused}"); - // 按优先级排序后通知 - foreach (var handler in _handlers.OrderBy(h => h.Priority)) + // 在锁内获取处理器快照,避免并发修改异常 + IPauseHandler[] handlersSnapshot; + _lock.EnterReadLock(); + try + { + handlersSnapshot = _handlers.OrderBy(h => h.Priority).ToArray(); + } + finally + { + _lock.ExitReadLock(); + } + + // 在锁外遍历快照并通知处理器 + foreach (var handler in handlersSnapshot) { try { diff --git a/deepsource.toml b/deepsource.toml index 086870a..ea03d43 100644 --- a/deepsource.toml +++ b/deepsource.toml @@ -1,5 +1,6 @@ -**/*.Tests.cs +**/*.Test.cs +**/*.Tests.cs **/*Test.cs -**/tests/** **/*Tests.cs -**/Tests/** \ No newline at end of file +**/*.Tests/** +**/*.Test/** \ No newline at end of file