mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-22 10:34:30 +08:00
refactor(architecture): 优化组件初始化和销毁管理机制
- 将_pendingInitializableList重命名为_pendingInitializableSet并改为HashSet类型, 实现组件去重功能 - 新增_pendingInitializableList保持组件注册顺序 - 将_disposables重命名为_disposableSet并改为HashSet类型,避免重复注册 - 新增_disposables列表保持销毁顺序 - 在添加可初始化组件时使用原子去重检查 - 在添加可销毁组件时使用原子去重检查 - 清空操作同步清理对应的Set集合 - 销毁组件时按注册逆序进行销毁,确保依赖关系正确处理
This commit is contained in:
parent
47326085e7
commit
44b7a223d8
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user