fix(game): 清理 SceneRouterBase 低风险异步包装

- 重构 Replace、Push、Pop、Clear 的 around pipeline 核心委托,移除匿名 async 包装

- 补充 BeforeChange 与 AfterChange 的 ConfigureAwait(false),收敛明显低风险 MA0004

- 保留场景生命周期与栈操作相关 await 的默认上下文行为,并在代码中说明原因
This commit is contained in:
gewuyou 2026-04-25 09:32:54 +08:00
parent 64c8589489
commit 4bb8f4f429

View File

@ -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
/// <summary>
/// 执行 Replace 的核心切换顺序。
/// </summary>
/// <param name="event">场景转换事件。</param>
/// <param name="sceneKey">目标场景键名。</param>
/// <param name="param">场景进入参数。</param>
/// <returns>异步任务。</returns>
private async Task ExecuteReplaceCoreAsync(
SceneTransitionEvent @event,
string sceneKey,
ISceneEnterParam? param)
{
// 场景生命周期回调可能依赖引擎线程,因此这里保留默认 await 行为。
await BeforeChangeAsync(@event);
await ClearInternalAsync();
await PushInternalAsync(sceneKey, param);
await AfterChangeAsync(@event);
}
/// <summary>
/// 执行 Push 的核心切换顺序。
/// </summary>
/// <param name="event">场景转换事件。</param>
/// <param name="sceneKey">目标场景键名。</param>
/// <param name="param">场景进入参数。</param>
/// <returns>异步任务。</returns>
private async Task ExecutePushCoreAsync(
SceneTransitionEvent @event,
string sceneKey,
ISceneEnterParam? param)
{
await BeforeChangeAsync(@event);
await PushInternalAsync(sceneKey, param);
await AfterChangeAsync(@event);
}
/// <summary>
/// 执行 Pop 的核心切换顺序。
/// </summary>
/// <param name="event">场景转换事件。</param>
/// <returns>异步任务。</returns>
private async Task ExecutePopCoreAsync(SceneTransitionEvent @event)
{
await BeforeChangeAsync(@event);
await PopInternalAsync();
await AfterChangeAsync(@event);
}
/// <summary>
/// 执行 Clear 的核心切换顺序。
/// </summary>
/// <param name="event">场景转换事件。</param>
/// <returns>异步任务。</returns>
private async Task ExecuteClearCoreAsync(SceneTransitionEvent @event)
{
await BeforeChangeAsync(@event);
await ClearInternalAsync();
await AfterChangeAsync(@event);
}
/// <summary>
/// 创建场景转换事件对象。
/// </summary>
@ -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
}
}