mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-25 13:33:28 +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
|
#region Fields
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 存储所有待初始化的组件(统一管理)
|
/// 待初始化组件的去重集合
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private readonly HashSet<IInitializable> _pendingInitializableList = [];
|
private readonly HashSet<IInitializable> _pendingInitializableSet = [];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 存储所有需要销毁的组件(统一管理)
|
/// 存储所有待初始化的组件(统一管理,保持注册顺序)
|
||||||
/// </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>
|
/// <summary>
|
||||||
/// 生命周期感知对象列表
|
/// 生命周期感知对象列表
|
||||||
@ -231,10 +241,14 @@ public abstract class Architecture(
|
|||||||
if (component is IInitializable initializable)
|
if (component is IInitializable initializable)
|
||||||
{
|
{
|
||||||
if (!_mInitialized)
|
if (!_mInitialized)
|
||||||
|
{
|
||||||
|
// 原子去重:HashSet.Add 返回 true 表示添加成功(之前不存在)
|
||||||
|
if (_pendingInitializableSet.Add(initializable))
|
||||||
{
|
{
|
||||||
_pendingInitializableList.Add(initializable);
|
_pendingInitializableList.Add(initializable);
|
||||||
_logger.Trace($"Added {component.GetType().Name} to pending initialization queue");
|
_logger.Trace($"Added {component.GetType().Name} to pending initialization queue");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException(
|
throw new InvalidOperationException(
|
||||||
@ -244,9 +258,13 @@ public abstract class Architecture(
|
|||||||
|
|
||||||
// 处理销毁
|
// 处理销毁
|
||||||
if (component is not IDisposable disposable) return;
|
if (component is not IDisposable disposable) return;
|
||||||
|
// 原子去重:HashSet.Add 返回 true 表示添加成功(之前不存在)
|
||||||
|
if (_disposableSet.Add(disposable))
|
||||||
|
{
|
||||||
_disposables.Add(disposable);
|
_disposables.Add(disposable);
|
||||||
_logger.Trace($"Registered {component.GetType().Name} for destruction");
|
_logger.Trace($"Registered {component.GetType().Name} for destruction");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 初始化所有待初始化的组件
|
/// 初始化所有待初始化的组件
|
||||||
@ -316,6 +334,7 @@ public abstract class Architecture(
|
|||||||
EnterPhase(ArchitecturePhase.AfterSystemInit);
|
EnterPhase(ArchitecturePhase.AfterSystemInit);
|
||||||
|
|
||||||
_pendingInitializableList.Clear();
|
_pendingInitializableList.Clear();
|
||||||
|
_pendingInitializableSet.Clear();
|
||||||
_logger.Info("All components initialized");
|
_logger.Info("All components initialized");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -358,11 +377,12 @@ public abstract class Architecture(
|
|||||||
EnterPhase(ArchitecturePhase.Destroying);
|
EnterPhase(ArchitecturePhase.Destroying);
|
||||||
EventBus.Send(new ArchitectureEvents.ArchitectureDestroyingEvent());
|
EventBus.Send(new ArchitectureEvents.ArchitectureDestroyingEvent());
|
||||||
|
|
||||||
// 销毁所有实现了 IDisposable 的组件
|
// 销毁所有实现了 IDisposable 的组件(按注册逆序销毁)
|
||||||
_logger.Info($"Destroying {_disposables.Count} disposable components");
|
_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
|
try
|
||||||
{
|
{
|
||||||
_logger.Debug($"Destroying component: {disposable.GetType().Name}");
|
_logger.Debug($"Destroying component: {disposable.GetType().Name}");
|
||||||
@ -376,6 +396,7 @@ public abstract class Architecture(
|
|||||||
}
|
}
|
||||||
|
|
||||||
_disposables.Clear();
|
_disposables.Clear();
|
||||||
|
_disposableSet.Clear();
|
||||||
|
|
||||||
// 进入已销毁阶段并发送销毁完成事件
|
// 进入已销毁阶段并发送销毁完成事件
|
||||||
EnterPhase(ArchitecturePhase.Destroyed);
|
EnterPhase(ArchitecturePhase.Destroyed);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user