mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-05-07 00:39:00 +08:00
fix(game): 清理 SceneRouterBase 低风险异步包装
- 重构 Replace、Push、Pop、Clear 的 around pipeline 核心委托,移除匿名 async 包装 - 补充 BeforeChange 与 AfterChange 的 ConfigureAwait(false),收敛明显低风险 MA0004 - 保留场景生命周期与栈操作相关 await 的默认上下文行为,并在代码中说明原因
This commit is contained in:
parent
64c8589489
commit
4bb8f4f429
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user