GeWuYou f984f4a600 refactor(core): 优化核心组件的线程安全性和错误处理
- 重构 AsyncLogAppender 的 Flush 方法,添加超时控制和 SpinWait 优化
- 为 BindableProperty 添加线程安全锁保护,确保并发访问的安全性
- 在 BindableProperty 中实现回调外部调用以避免死锁问题
- 为 EasyEvents 使用 ConcurrentDictionary 替代 Dictionary 提高并发性能
- 添加协程调度器异常处理回调机制,防止异常传播导致调度器崩溃
- 为 FileAppender 添加初始化异常处理和资源清理逻辑
- 补充完整的单元测试覆盖并发场景下的线程安全性验证
2026-03-04 11:04:59 +08:00

84 lines
3.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections.Concurrent;
using GFramework.Core.Abstractions.events;
namespace GFramework.Core.events;
/// <summary>
/// EasyEvents事件管理器类用于全局事件的注册、获取和管理
/// 提供了类型安全的事件系统,支持泛型事件的自动创建和检索
/// 线程安全:所有公共方法都是线程安全的
/// </summary>
public class EasyEvents
{
/// <summary>
/// 全局单例事件管理器实例
/// </summary>
private static readonly EasyEvents MGlobalEvents = new();
/// <summary>
/// 存储事件类型与事件实例映射关系的字典(线程安全)
/// </summary>
private readonly ConcurrentDictionary<Type, IEvent> _mTypeEvents = new();
/// <summary>
/// 获取指定类型的全局事件实例
/// </summary>
/// <typeparam name="T">事件类型必须实现IEasyEvent接口</typeparam>
/// <returns>指定类型的事件实例,如果未注册则返回默认值</returns>
public static T Get<T>() where T : IEvent
{
return MGlobalEvents.GetEvent<T>();
}
/// <summary>
/// 注册指定类型的全局事件
/// </summary>
/// <typeparam name="T">事件类型必须实现IEasyEvent接口且具有无参构造函数</typeparam>
public static void Register<T>() where T : IEvent, new()
{
MGlobalEvents.AddEvent<T>();
}
/// <summary>
/// 获取或添加指定类型的全局事件
/// </summary>
/// <typeparam name="T">事件类型必须实现IEasyEvent接口且具有无参构造函数</typeparam>
/// <returns>指定类型的事件实例</returns>
public static T GetOrAdd<T>() where T : IEvent, new()
{
return MGlobalEvents.GetOrAddEvent<T>();
}
/// <summary>
/// 添加指定类型的事件到事件字典中
/// </summary>
/// <typeparam name="T">事件类型必须实现IEasyEvent接口且具有无参构造函数</typeparam>
/// <exception cref="ArgumentException">当事件类型已存在时抛出</exception>
public void AddEvent<T>() where T : IEvent, new()
{
if (!_mTypeEvents.TryAdd(typeof(T), new T()))
{
throw new ArgumentException($"Event type {typeof(T).Name} already registered.");
}
}
/// <summary>
/// 获取指定类型的事件实例
/// </summary>
/// <typeparam name="T">事件类型必须实现IEasyEvent接口</typeparam>
/// <returns>指定类型的事件实例,如果不存在则返回默认值</returns>
public T GetEvent<T>() where T : IEvent
{
return _mTypeEvents.TryGetValue(typeof(T), out var e) ? (T)e : default!;
}
/// <summary>
/// 获取指定类型的事件实例,如果不存在则创建并添加到事件字典中
/// </summary>
/// <typeparam name="T">事件类型必须实现IEasyEvent接口且具有无参构造函数</typeparam>
/// <returns>指定类型的事件实例</returns>
public T GetOrAddEvent<T>() where T : IEvent, new()
{
return (T)_mTypeEvents.GetOrAdd(typeof(T), _ => new T());
}
}