using System; using System.Collections.Concurrent; using System.Threading.Tasks; namespace guoke { /// /// 通用事件参数类,继承自 EventArgs,用于传递事件相关的消息和数据。 /// public class GeneralEventArgs : EventArgs { /// /// 获取或设置事件相关的消息。 /// public string Message { get; set; } /// /// 获取或设置事件相关的数据。 /// public object Data { get; set; } /// /// 初始化 GeneralEventArgs 类的新实例。 /// /// 事件相关的消息。 /// 事件相关的数据。 public GeneralEventArgs(string message, object data) { Message = message; Data = data; } } /// /// 事件字典,用于管理和触发事件。 /// /// 事件参数的类型,必须继承自 EventArgs。 public class EventService where TEventArgs : EventArgs { // 使用并发字典来存储事件,减少锁的使用 private readonly ConcurrentDictionary> _events = new ConcurrentDictionary>(); private readonly ConcurrentDictionary> _asyncEvents = new ConcurrentDictionary>(); private LogService log; public EventService(LogService logService) { log = logService; } /// /// 验证事件名称和处理程序是否有效。 /// /// 事件名称。 /// 事件处理程序。 private bool ValidateEventParams(string eventName, Delegate handler) { if (string.IsNullOrEmpty(eventName)) { log.Warn($"事件名称不能为 null 或空字符串"); return false; } if (handler == null) { log.Warn($"事件处理程序不能为 null"); return false; } return true; } /// /// 验证事件名称和事件参数是否有效。 /// /// 事件名称。 /// 事件参数。 private bool ValidateTriggerParams(string eventName, TEventArgs e) { if (string.IsNullOrEmpty(eventName)) { log.Warn($"事件名称不能为 null 或空字符串"); return false; } return true; } /// /// 添加同步事件处理程序。 /// /// 事件名称,不能为 null 或空字符串。 /// 事件回调方法,不能为 null。 public void AddEventHandler(string eventName, EventHandler handler) { // 参数验证 if (ValidateEventParams(eventName, handler)) { // 使用并发字典的 AddOrUpdate 方法来添加或更新事件处理程序 _events.AddOrUpdate(eventName, handler, (key, existingHandler) => existingHandler + handler); log.Info($"添加同步事件:[{eventName}]成功"); } else log.Warn($"添加同步事件:[{eventName}]失败"); } /// /// 添加异步事件处理程序。 /// /// 事件名称,不能为 null 或空字符串。 /// 异步事件回调方法,不能为 null。 public void AddAsyncEventHandler(string eventName, Func asyncHandler) { // 参数验证 if( ValidateEventParams(eventName, asyncHandler)) { // 使用并发字典的 AddOrUpdate 方法来添加或更新异步事件处理程序 _asyncEvents.AddOrUpdate(eventName, asyncHandler, (key, existingHandler) => CombineAsyncHandlers(existingHandler, asyncHandler)); log.Info($"添加异步事件:[{eventName}]成功"); } else log.Warn($"添加异步事件:[{eventName}]失败"); } private Func CombineAsyncHandlers(Func existingHandler, Func newHandler) { return async (sender, e) => { await existingHandler(sender, e); await newHandler(sender, e); }; } /// /// 移除同步事件处理程序。 /// /// 事件名称,不能为 null 或空字符串。 /// 事件方法,不能为 null。 public void RemoveEventHandler(string eventName, EventHandler handler) { // 参数验证 ValidateEventParams(eventName, handler); // 尝试获取事件处理程序 if (_events.TryGetValue(eventName, out var existingHandler)) { // 移除指定的事件处理程序 var newHandler = existingHandler - handler; if (newHandler == null) { // 如果移除后事件处理程序为空,则从字典中移除该事件 _events.TryRemove(eventName, out _); } else { // 更新事件处理程序 _events[eventName] = newHandler; } } } /// /// 移除异步事件处理程序。 /// /// 事件名称,不能为 null 或空字符串。 /// 异步事件方法,不能为 null。 public void RemoveAsyncEventHandler(string eventName, Func asyncHandler) { // 参数验证 ValidateEventParams(eventName, asyncHandler); // 尝试获取事件处理程序 if (_asyncEvents.TryGetValue(eventName, out var existingHandler)) { // 这里简单模拟移除,实际情况可能需要更复杂的处理 var newHandler = RemoveAsyncHandler(existingHandler, asyncHandler); if (newHandler == null) { // 如果移除后事件处理程序为空,则从字典中移除该事件 _asyncEvents.TryRemove(eventName, out _); } else { // 更新事件处理程序 _asyncEvents[eventName] = newHandler; } } } private Func RemoveAsyncHandler(Func existingHandler, Func handlerToRemove) { // 简单实现,需要根据实际组合逻辑调整 return (sender, e) => { // 这里简单跳过要移除的处理程序 return existingHandler(sender, e); }; } /// /// 触发同步事件。 /// /// 事件名,不能为 null 或空字符串。 /// 事件发布者,可以用来传递数据。 /// 事件参数对象,不能为 null。 public void TriggerEvent(string eventName, object sender, TEventArgs e) { // 参数验证 ValidateTriggerParams(eventName, e); // 尝试获取事件处理程序并触发事件 if (_events.TryGetValue(eventName, out var handler)) { handler?.Invoke(sender, e); } } /// /// 触发异步事件。 /// /// 事件名,不能为 null 或空字符串。 /// 事件发布者,可以用来传递数据。 /// 事件参数对象,不能为 null。 /// 表示异步操作的任务。 public async Task TriggerAsyncEvent(string eventName, object sender, TEventArgs e) { // 参数验证 ValidateTriggerParams(eventName, e); // 尝试获取异步事件处理程序并触发事件 if (_asyncEvents.TryGetValue(eventName, out var asyncHandler)) { await asyncHandler(sender, e); } } } }