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 +}