From 4bb8f4f429522142ba4ce5a735a09122780e4e04 Mon Sep 17 00:00:00 2001 From: gewuyou <95328647+GeWuYou@users.noreply.github.com> Date: Sat, 25 Apr 2026 09:32:54 +0800 Subject: [PATCH] =?UTF-8?q?fix(game):=20=E6=B8=85=E7=90=86=20SceneRouterBa?= =?UTF-8?q?se=20=E4=BD=8E=E9=A3=8E=E9=99=A9=E5=BC=82=E6=AD=A5=E5=8C=85?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重构 Replace、Push、Pop、Clear 的 around pipeline 核心委托,移除匿名 async 包装 - 补充 BeforeChange 与 AfterChange 的 ConfigureAwait(false),收敛明显低风险 MA0004 - 保留场景生命周期与栈操作相关 await 的默认上下文行为,并在代码中说明原因 --- GFramework.Game/Scene/SceneRouterBase.cs | 103 +++++++++++++++++------ 1 file changed, 75 insertions(+), 28 deletions(-) diff --git a/GFramework.Game/Scene/SceneRouterBase.cs b/GFramework.Game/Scene/SceneRouterBase.cs index 812644c3..c09fd66a 100644 --- a/GFramework.Game/Scene/SceneRouterBase.cs +++ b/GFramework.Game/Scene/SceneRouterBase.cs @@ -89,13 +89,9 @@ public abstract class SceneRouterBase var @event = CreateEvent(sceneKey, SceneTransitionType.Replace, param); - await _pipeline.ExecuteAroundAsync(@event, async () => - { - await BeforeChangeAsync(@event); - await ClearInternalAsync(); - await PushInternalAsync(sceneKey, param); - await AfterChangeAsync(@event); - }); + await _pipeline.ExecuteAroundAsync( + @event, + () => ExecuteReplaceCoreAsync(@event, sceneKey, param)).ConfigureAwait(false); } finally { @@ -195,12 +191,9 @@ public abstract class SceneRouterBase var @event = CreateEvent(sceneKey, SceneTransitionType.Push, param); - await _pipeline.ExecuteAroundAsync(@event, async () => - { - await BeforeChangeAsync(@event); - await PushInternalAsync(sceneKey, param); - await AfterChangeAsync(@event); - }); + await _pipeline.ExecuteAroundAsync( + @event, + () => ExecutePushCoreAsync(@event, sceneKey, param)).ConfigureAwait(false); } finally { @@ -276,12 +269,9 @@ public abstract class SceneRouterBase var @event = CreateEvent(null, SceneTransitionType.Pop); - await _pipeline.ExecuteAroundAsync(@event, async () => - { - await BeforeChangeAsync(@event); - await PopInternalAsync(); - await AfterChangeAsync(@event); - }); + await _pipeline.ExecuteAroundAsync( + @event, + () => ExecutePopCoreAsync(@event)).ConfigureAwait(false); } finally { @@ -347,12 +337,9 @@ public abstract class SceneRouterBase var @event = CreateEvent(null, SceneTransitionType.Clear); - await _pipeline.ExecuteAroundAsync(@event, async () => - { - await BeforeChangeAsync(@event); - await ClearInternalAsync(); - await AfterChangeAsync(@event); - }); + await _pipeline.ExecuteAroundAsync( + @event, + () => ExecuteClearCoreAsync(@event)).ConfigureAwait(false); } finally { @@ -378,6 +365,66 @@ public abstract class SceneRouterBase #region Helper Methods + /// + /// 执行 Replace 的核心切换顺序。 + /// + /// 场景转换事件。 + /// 目标场景键名。 + /// 场景进入参数。 + /// 异步任务。 + private async Task ExecuteReplaceCoreAsync( + SceneTransitionEvent @event, + string sceneKey, + ISceneEnterParam? param) + { + // 场景生命周期回调可能依赖引擎线程,因此这里保留默认 await 行为。 + await BeforeChangeAsync(@event); + await ClearInternalAsync(); + await PushInternalAsync(sceneKey, param); + await AfterChangeAsync(@event); + } + + /// + /// 执行 Push 的核心切换顺序。 + /// + /// 场景转换事件。 + /// 目标场景键名。 + /// 场景进入参数。 + /// 异步任务。 + private async Task ExecutePushCoreAsync( + SceneTransitionEvent @event, + string sceneKey, + ISceneEnterParam? param) + { + await BeforeChangeAsync(@event); + await PushInternalAsync(sceneKey, param); + await AfterChangeAsync(@event); + } + + /// + /// 执行 Pop 的核心切换顺序。 + /// + /// 场景转换事件。 + /// 异步任务。 + private async Task ExecutePopCoreAsync(SceneTransitionEvent @event) + { + await BeforeChangeAsync(@event); + await PopInternalAsync(); + await AfterChangeAsync(@event); + } + + /// + /// 执行 Clear 的核心切换顺序。 + /// + /// 场景转换事件。 + /// 异步任务。 + private async Task ExecuteClearCoreAsync(SceneTransitionEvent @event) + { + await BeforeChangeAsync(@event); + await ClearInternalAsync(); + await AfterChangeAsync(@event); + } + /// /// 创建场景转换事件对象。 /// @@ -407,7 +454,7 @@ public abstract class SceneRouterBase private async Task BeforeChangeAsync(SceneTransitionEvent @event) { Log.Debug("BeforeChange phases started: {0}", @event.TransitionType); - await _pipeline.ExecuteAsync(@event, SceneTransitionPhases.BeforeChange); + await _pipeline.ExecuteAsync(@event, SceneTransitionPhases.BeforeChange).ConfigureAwait(false); Log.Debug("BeforeChange phases completed: {0}", @event.TransitionType); } @@ -418,9 +465,9 @@ public abstract class SceneRouterBase private async Task AfterChangeAsync(SceneTransitionEvent @event) { Log.Debug("AfterChange phases started: {0}", @event.TransitionType); - await _pipeline.ExecuteAsync(@event, SceneTransitionPhases.AfterChange); + await _pipeline.ExecuteAsync(@event, SceneTransitionPhases.AfterChange).ConfigureAwait(false); Log.Debug("AfterChange phases completed: {0}", @event.TransitionType); } #endregion -} \ No newline at end of file +}