public async Task <T> doEvent <T>(T eventArg, Func <T, Task> action) where T : IEventArg { if (eventArg == null) { throw new ArgumentNullException(nameof(eventArg)); } EventArgItem eventArgItem = new EventArgItem(eventArg); if (currentEvent != null) { eventArg.parent = currentEvent; } _eventChainList.Add(eventArgItem); _eventRecordList.Add(eventArgItem); eventArg.isCanceled = false; eventArg.repeatTime = 0; eventArg.action = arg => { return(action.Invoke((T)arg)); }; //Before doEventNames = eventArg.beforeNames; if (doEventNames == null) { doEventNames = new string[] { getNameBefore <T>() } } ; else { doEventNames = doEventNames.Concat(new string[] { getNameBefore <T>() }).Distinct().ToArray(); } List <ITrigger> triggerList = new List <ITrigger>(); foreach (string eventName in doEventNames) { EventListItem eventItem = _eventList.FirstOrDefault(ei => ei.eventName == eventName); if (eventItem == null) { continue; } eventItem.triggerList.Sort((a, b) => a.trigger.compare(b.trigger, eventArg)); triggerList.AddRange(eventItem.triggerList.Select(ti => ti.trigger)); } triggerList.Sort((a, b) => a.compare(b, eventArg)); while (triggerList.Count > 0) { ITrigger trigger = triggerList[0]; triggerList.RemoveAt(0); if (eventArg.isCanceled) { break; } if (trigger is ITrigger <T> triggerT) { logger?.log("Trigger", "运行触发器" + triggerT); try { await triggerT.invoke(eventArg); } catch (Exception e) { logger?.logError("Trigger", "运行触发器" + triggerT + "引发异常:" + e); } } else { logger?.log("Trigger", "运行触发器" + trigger); try { await trigger.invoke(eventArg); } catch (Exception e) { logger?.logError("Trigger", "运行触发器" + trigger + "引发异常:" + e); } } if (_insertEventList.Count > 0) { foreach (string beforeName in doEventNames) { EventListItem insertEventItem = _insertEventList.FirstOrDefault(ei => ei.eventName == beforeName); if (insertEventItem == null) { continue; } if (insertEventItem.triggerList.Count > 0) { EventListItem eventItem = _eventList.FirstOrDefault(ei => ei.eventName == beforeName); if (eventItem != null) { eventItem.triggerList.Sort((a, b) => a.trigger.compare(b.trigger, eventArg)); } triggerList.AddRange(insertEventItem.triggerList.Select(ti => ti.trigger)); logger?.log("运行中插入触发器" + string.Join(",", insertEventItem.triggerList.Select(ti => ti.trigger))); triggerList.Sort((a, b) => a.compare(b, eventArg)); _insertEventList.Remove(insertEventItem); } } _insertEventList.Clear(); } } doEventNames = null; //Callback try { onEventBefore?.Invoke(eventArg); } catch (Exception e) { logger?.log("Trigger", "执行" + eventArg + "发生前回调引发异常:" + e); } //Event int repeatTime = 0; do { if (eventArg.isCanceled) { break; } if (eventArg.action != null) { try { await eventArg.action.Invoke(eventArg); } catch (Exception e) { logger?.log("Error", "执行" + eventArg + "逻辑发生异常:" + e); } } repeatTime++; }while (repeatTime <= eventArg.repeatTime); //Callback try { onEventAfter?.Invoke(eventArg); } catch (Exception e) { logger?.logError("Trigger", "执行" + eventArg + "发生后回调引发异常:" + e); } //After doEventNames = eventArg.afterNames; if (doEventNames == null) { doEventNames = new string[] { getNameAfter <T>() } } ; else { doEventNames = doEventNames.Concat(new string[] { getNameAfter <T>() }).Distinct().ToArray(); } triggerList.Clear(); foreach (string eventName in doEventNames) { EventListItem eventItem = _eventList.FirstOrDefault(ei => ei.eventName == eventName); if (eventItem == null) { continue; } eventItem.triggerList.Sort((a, b) => a.trigger.compare(b.trigger, eventArg)); triggerList.AddRange(eventItem.triggerList.Select(ti => ti.trigger)); } triggerList.Sort((a, b) => a.compare(b, eventArg)); while (triggerList.Count > 0) { ITrigger trigger = triggerList[0]; triggerList.RemoveAt(0); if (eventArg.isCanceled) { break; } if (trigger is ITrigger <T> triggerT) { logger?.log("Trigger", "运行触发器" + triggerT); try { await triggerT.invoke(eventArg); } catch (Exception e) { logger?.logError("Trigger", "运行触发器" + triggerT + "引发异常:" + e); } } else { logger?.log("Trigger", "运行触发器" + trigger); try { await trigger.invoke(eventArg); } catch (Exception e) { logger?.logError("Trigger", "运行触发器" + trigger + "引发异常:" + e); } } if (_insertEventList.Count > 0) { foreach (string afterName in doEventNames) { EventListItem insertEventItem = _insertEventList.FirstOrDefault(ei => ei.eventName == afterName); if (insertEventItem == null) { continue; } if (insertEventItem.triggerList.Count > 0) { EventListItem eventItem = _eventList.FirstOrDefault(ei => ei.eventName == afterName); if (eventItem != null) { eventItem.triggerList.Sort((a, b) => a.trigger.compare(b.trigger, eventArg)); } logger?.log("Trigger", "插入触发器" + string.Join(",", insertEventItem.triggerList.Select(ti => ti.trigger))); triggerList.AddRange(insertEventItem.triggerList.Select(ti => ti.trigger)); triggerList.Sort((a, b) => a.compare(b, eventArg)); _insertEventList.Remove(insertEventItem); } } _insertEventList.Clear(); } } doEventNames = null; _eventChainList.Remove(eventArgItem); if (eventArg.isCanceled) { return(default);
public async Task <T> doEvent <T>(T eventArg) where T : IEventArg { if (eventArg == null) { throw new ArgumentNullException(nameof(eventArg)); } //加入事件链 EventArgItem eventArgItem = new EventArgItem(eventArg); if (currentEvent != null) { eventArg.parent = currentEvent; } _eventChainList.Add(eventArgItem); _eventRecordList.Add(eventArgItem); try { onEventBefore?.Invoke(eventArg); } catch (Exception e) { logger?.logError("Trigger", "执行" + eventArg + "发生前回调引发异常:" + e); } //获取事件名 doEventNames = eventArg.afterNames; if (doEventNames == null) { doEventNames = new string[] { getName <T>() } } ; else { doEventNames = doEventNames.Concat(new string[] { getName <T>() }).Distinct().ToArray(); } //对注册事件进行排序 List <ITrigger> triggerList = new List <ITrigger>(); foreach (string eventName in doEventNames) { EventListItem eventItem = _eventList.FirstOrDefault(ei => ei.eventName == eventName); if (eventItem == null) { continue; } eventItem.triggerList.Sort((a, b) => a.trigger.compare(b.trigger, eventArg)); triggerList.AddRange(eventItem.triggerList.Select(ti => ti.trigger)); } triggerList.Sort((a, b) => a.compare(b, eventArg)); //执行注册事件 while (triggerList.Count > 0) { ITrigger trigger = triggerList[0]; triggerList.RemoveAt(0); if (trigger is ITrigger <T> triggerT) { logger?.log("Trigger", "运行触发器" + triggerT); try { await triggerT.invoke(eventArg); } catch (Exception e) { logger?.logError("Trigger", "运行触发器" + triggerT + "引发异常:" + e); } } else { logger?.log("Trigger", "运行触发器" + trigger); try { await trigger.invoke(eventArg); } catch (Exception e) { logger?.logError("Trigger", "运行触发器" + trigger + "引发异常:" + e); } } if (_insertEventList.Count > 0) { foreach (string eventName in doEventNames) { EventListItem insertEventItem = _insertEventList.FirstOrDefault(ei => ei.eventName == eventName); if (insertEventItem == null) { continue; } if (insertEventItem.triggerList.Count > 0) { EventListItem eventItem = _eventList.FirstOrDefault(ei => ei.eventName == eventName); if (eventItem != null) { eventItem.triggerList.Sort((a, b) => a.trigger.compare(b.trigger, eventArg)); } triggerList.AddRange(insertEventItem.triggerList.Select(ti => ti.trigger)); logger?.log("运行中插入触发器" + string.Join(",", insertEventItem.triggerList.Select(ti => ti.trigger))); triggerList.Sort((a, b) => a.compare(b, eventArg)); _insertEventList.Remove(insertEventItem); } } _insertEventList.Clear(); } } doEventNames = null; try { onEventAfter?.Invoke(eventArg); } catch (Exception e) { logger?.logError("Trigger", "执行" + eventArg + "发生后回调引发异常:" + e); } //移出事件链 _eventChainList.Remove(eventArgItem); return(eventArg); }