示例#1
0
        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);
示例#2
0
        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);
        }