diff --git a/GFramework.Core/architecture/Architecture.cs b/GFramework.Core/architecture/Architecture.cs
index 33af54b..a47cd64 100644
--- a/GFramework.Core/architecture/Architecture.cs
+++ b/GFramework.Core/architecture/Architecture.cs
@@ -101,14 +101,24 @@ public abstract class Architecture(
#region Fields
///
- /// 存储所有待初始化的组件(统一管理)
+ /// 待初始化组件的去重集合
///
- private readonly HashSet _pendingInitializableList = [];
+ private readonly HashSet _pendingInitializableSet = [];
///
- /// 存储所有需要销毁的组件(统一管理)
+ /// 存储所有待初始化的组件(统一管理,保持注册顺序)
///
- private readonly HashSet _disposables = [];
+ private readonly List _pendingInitializableList = [];
+
+ ///
+ /// 可销毁组件的去重集合
+ ///
+ private readonly HashSet _disposableSet = [];
+
+ ///
+ /// 存储所有需要销毁的组件(统一管理,保持注册逆序销毁)
+ ///
+ private readonly List _disposables = [];
///
/// 生命周期感知对象列表
@@ -232,8 +242,12 @@ public abstract class Architecture(
{
if (!_mInitialized)
{
- _pendingInitializableList.Add(initializable);
- _logger.Trace($"Added {component.GetType().Name} to pending initialization queue");
+ // 原子去重:HashSet.Add 返回 true 表示添加成功(之前不存在)
+ if (_pendingInitializableSet.Add(initializable))
+ {
+ _pendingInitializableList.Add(initializable);
+ _logger.Trace($"Added {component.GetType().Name} to pending initialization queue");
+ }
}
else
{
@@ -244,8 +258,12 @@ public abstract class Architecture(
// 处理销毁
if (component is not IDisposable disposable) return;
- _disposables.Add(disposable);
- _logger.Trace($"Registered {component.GetType().Name} for destruction");
+ // 原子去重:HashSet.Add 返回 true 表示添加成功(之前不存在)
+ if (_disposableSet.Add(disposable))
+ {
+ _disposables.Add(disposable);
+ _logger.Trace($"Registered {component.GetType().Name} for destruction");
+ }
}
///
@@ -316,6 +334,7 @@ public abstract class Architecture(
EnterPhase(ArchitecturePhase.AfterSystemInit);
_pendingInitializableList.Clear();
+ _pendingInitializableSet.Clear();
_logger.Info("All components initialized");
}
@@ -358,11 +377,12 @@ public abstract class Architecture(
EnterPhase(ArchitecturePhase.Destroying);
EventBus.Send(new ArchitectureEvents.ArchitectureDestroyingEvent());
- // 销毁所有实现了 IDisposable 的组件
+ // 销毁所有实现了 IDisposable 的组件(按注册逆序销毁)
_logger.Info($"Destroying {_disposables.Count} disposable components");
- foreach (var disposable in _disposables)
+ for (var i = _disposables.Count - 1; i >= 0; i--)
{
+ var disposable = _disposables[i];
try
{
_logger.Debug($"Destroying component: {disposable.GetType().Name}");
@@ -376,6 +396,7 @@ public abstract class Architecture(
}
_disposables.Clear();
+ _disposableSet.Clear();
// 进入已销毁阶段并发送销毁完成事件
EnterPhase(ArchitecturePhase.Destroyed);