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