refactor(architecture): 优化组件初始化和销毁管理机制

- 将_pendingInitializableList重命名为_pendingInitializableSet并改为HashSet类型,
  实现组件去重功能
- 新增_pendingInitializableList保持组件注册顺序
- 将_disposables重命名为_disposableSet并改为HashSet类型,避免重复注册
- 新增_disposables列表保持销毁顺序
- 在添加可初始化组件时使用原子去重检查
- 在添加可销毁组件时使用原子去重检查
- 清空操作同步清理对应的Set集合
- 销毁组件时按注册逆序进行销毁,确保依赖关系正确处理
This commit is contained in:
GeWuYou 2026-01-17 11:30:39 +08:00
parent 47326085e7
commit 44b7a223d8

View File

@ -101,14 +101,24 @@ public abstract class Architecture(
#region Fields
/// <summary>
/// 存储所有待初始化的组件(统一管理)
/// 待初始化组件的去重集合
/// </summary>
private readonly HashSet<IInitializable> _pendingInitializableList = [];
private readonly HashSet<IInitializable> _pendingInitializableSet = [];
/// <summary>
/// 存储所有需要销毁的组件(统一管理
/// 存储所有待初始化的组件(统一管理,保持注册顺序
/// </summary>
private readonly HashSet<IDisposable> _disposables = [];
private readonly List<IInitializable> _pendingInitializableList = [];
/// <summary>
/// 可销毁组件的去重集合
/// </summary>
private readonly HashSet<IDisposable> _disposableSet = [];
/// <summary>
/// 存储所有需要销毁的组件(统一管理,保持注册逆序销毁)
/// </summary>
private readonly List<IDisposable> _disposables = [];
/// <summary>
/// 生命周期感知对象列表
@ -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");
}
}
/// <summary>
@ -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);