Exemplo n.º 1
0
 public void Reset()
 {
     _key           = 0;
     _dispatcherObj = null;
     _status        = EntryStatus.IDLE;
     _priority      = EntryPriority.NORMAL;
 }
Exemplo n.º 2
0
        private void SafeRemoveDispatcherObj(int key, IDynamicDispatcherObj dispatcherObj)
        {
            if (_listeners == null || !_listeners.ContainsKey(key))
            {
                return;
            }

            List <List <DynamicDispatcherObjEntry> > allEntries = _listeners[key];
            int priorityCount = allEntries.Count;
            int count;
            List <DynamicDispatcherObjEntry> entries;

            for (int i = 0; i < priorityCount; ++i)
            {
                entries = allEntries[i];
                count   = entries.Count;
                for (int j = count - 1; j > -1; --j)
                {
                    if (entries[j].DispatcherObj.EqualOther(dispatcherObj))
                    {
                        _pool.SaveObject(entries[j]);
                        entries.RemoveAt(j);
                    }
                }
            }
        }
Exemplo n.º 3
0
 public void RemoveDispatcherObj(int key, IDynamicDispatcherObj dispatcherObj)
 {
     if (_listeners != null && _listeners.ContainsKey(key))
     {
         if (_isDispatching)
         {
             DynamicDispatcherObjEntry entry = _pool.GetObject();
             entry.DispatcherObj = dispatcherObj;
             entry.Status        = DynamicDispatcherObjEntry.EntryStatus.TODELETE;
             entry.Key           = key;
             _pendings.Add(entry);
         }
         else
         {
             SafeRemoveDispatcherObj(key, dispatcherObj);
         }
     }
 }
Exemplo n.º 4
0
        /// <summary>
        /// 监听事件
        /// </summary>
        /// <param name="eventId"></param>
        /// <param name="handler"></param>
        /// <param name="priorty"></param>
        public void AddDispatcherObj(int key, IDynamicDispatcherObj dispatcherObj, DynamicDispatcherObjEntry.EntryPriority priorty = DynamicDispatcherObjEntry.EntryPriority.NORMAL)
        {
            if (HasDispatcher(key, dispatcherObj))
            {
                return;
            }

            if (_listeners == null)
            {
                _listeners = new Dictionary <int, List <List <DynamicDispatcherObjEntry> > >();
            }

            if (!_listeners.ContainsKey(key))
            {
                _listeners[key] = new List <List <DynamicDispatcherObjEntry> >();
                List <List <DynamicDispatcherObjEntry> > allEntries = _listeners[key];
                int priorityCount = (int)DynamicDispatcherObjEntry.EntryPriority.COUNT;
                for (int i = 0; i < priorityCount; ++i)
                {
                    List <DynamicDispatcherObjEntry> entries = new List <DynamicDispatcherObjEntry>();
                    allEntries.Add(entries);
                }
            }

            DynamicDispatcherObjEntry entry = _pool.GetObject();

            entry.DispatcherObj = dispatcherObj;
            entry.Priority      = priorty;
            entry.Key           = key;

            if (_isDispatching)
            {
                entry.Status = DynamicDispatcherObjEntry.EntryStatus.TOINSERT;
                _pendings.Add(entry);
            }
            else
            {
                entry.Status = DynamicDispatcherObjEntry.EntryStatus.ACTIVE;
                List <List <DynamicDispatcherObjEntry> > allEntries = _listeners[key];

                List <DynamicDispatcherObjEntry> entries = allEntries[(int)priorty];
                entries.Add(entry);
            }
        }
Exemplo n.º 5
0
        public bool HasDispatcher(int key, IDynamicDispatcherObj dispatcherObj)
        {
            bool bRet = false;

            if ((_listeners == null) || !_listeners.ContainsKey(key))
            {
                return(bRet);
            }

            List <List <DynamicDispatcherObjEntry> > allEntries = _listeners[key];
            int  priorityCount = allEntries.Count;
            int  count;
            bool flag = false;
            List <DynamicDispatcherObjEntry> entries;

            for (int i = 0; i < priorityCount; ++i)
            {
                entries = allEntries[i];
                count   = entries.Count;
                for (int j = 0; j < count; ++j)
                {
                    if (entries[j].DispatcherObj.EqualOther(dispatcherObj))
                    {
                        flag = true;
                        break;
                    }
                }

                if (flag)
                {
                    break;
                }
            }

            // when dispatching,check the toInsert,toDelete
            if (_isDispatching)
            {
                count = _pendings.Count;
                int insertTimes = 0;
                for (int i = 0; i < count; ++i)
                {
                    if (_pendings[i].DispatcherObj.EqualOther(dispatcherObj) && _pendings[i].Key == key)
                    {
                        if (_pendings[i].Status == DynamicDispatcherObjEntry.EntryStatus.TOINSERT)
                        {
                            insertTimes++;
                            if (insertTimes > 1)
                            {
                                insertTimes = 1;
                            }
                        }
                        else if (_pendings[i].Status == DynamicDispatcherObjEntry.EntryStatus.TODELETE)
                        {
                            insertTimes--;
                            if (insertTimes < -1)
                            {
                                insertTimes = -1;
                            }
                        }
                    }
                }
                if (bRet && (insertTimes < 0))
                {
                    bRet = false;
                }
                if (!bRet && (insertTimes > 0))
                {
                    bRet = true;
                }
            }
            else
            {
                return(flag);
            }

            return(bRet);
        }
Exemplo n.º 6
0
        /// <summary>
        /// 派发事件,当参数为一个或没有时调用
        /// </summary>
        /// <param name="eventId"></param>
        /// <param name="args"></param>
        public void Dispatch(int key, object args = null)
        {
            if (_listeners == null || !_listeners.ContainsKey(key))
            {
                return;
            }
            if (_isDispatching)
            {
                DynamicDispatcherEntry dispatchEntry = _poolDispatch.GetObject();
                dispatchEntry.Key  = key;
                dispatchEntry.Args = args;
                _dispatchPendings.Enqueue(dispatchEntry);
                return;
            }

            _isDispatching = true;

            List <List <DynamicDispatcherObjEntry> > allEntries = _listeners[key];
            int priorityCount = allEntries.Count;
            int count;
            List <DynamicDispatcherObjEntry> entries;

            for (int i = priorityCount - 1; i > -1; --i)
            {
                entries = allEntries[i];
                count   = entries.Count;
                //先添加的事件需要先执行
                _lstRemoveId.Clear();
                for (int j = 0; j < count; ++j)
                {
                    IDynamicDispatcherObj dispatcherObj = entries[j].DispatcherObj;
                    try
                    {
                        object p = args;
                        if (args != null && args is DynamicDispatcherParam)
                        {
                            p = ((DynamicDispatcherParam)args).Arg;
                        }
                        if (!dispatcherObj.OnDispatcher(p))
                        {
                            //移除
                            _lstRemoveId.Add(j);
                        }
                    }
                    catch (Exception e)
                    {
                        CLog.LogError(e.ToString());
                    }
                }
                //移除
                for (int j = _lstRemoveId.Count - 1; j > -1; j--)
                {
                    entries.RemoveAt(_lstRemoveId[j]);
                }
            }
            _isDispatching = false;
            if (_isClear)
            {
                Clear();
            }

            //deal with pendings
            count = _pendings.Count;
            for (int i = 0; i < count; ++i)
            {
                if (_pendings[i].Status == DynamicDispatcherObjEntry.EntryStatus.TOINSERT)
                {
                    _pendings[i].Status = DynamicDispatcherObjEntry.EntryStatus.ACTIVE;
                    allEntries          = _listeners[_pendings[i].Key];
                    entries             = allEntries[(int)(_pendings[i].Priority)];
                    entries.Add(_pendings[i]);
                }
                else if (_pendings[i].Status == DynamicDispatcherObjEntry.EntryStatus.TODELETE)
                {
                    SafeRemoveDispatcherObj(_pendings[i].Key, _pendings[i].DispatcherObj);
                    _pool.SaveObject(_pendings[i]);
                }
            }
            _pendings.Clear();

            if (_dispatchPendings.Count > 0)
            {
                DynamicDispatcherEntry dispatchEntry = _dispatchPendings.Dequeue();
                object p = dispatchEntry.Args;
                if (dispatchEntry.Args != null && dispatchEntry.Args is DynamicDispatcherParam)
                {
                    p = ((DynamicDispatcherParam)dispatchEntry.Args).Arg;
                }
                Dispatch(dispatchEntry.Key, p);
                _poolDispatch.SaveObject(dispatchEntry);
            }
        }
Exemplo n.º 7
0
 public void AddDispatcherObj(int key, IDynamicDispatcherObj dispatcherObj, int priorty)
 {
     AddDispatcherObj(key, dispatcherObj, (DynamicDispatcherObjEntry.EntryPriority)priorty);
 }
Exemplo n.º 8
0
 public bool EqualOther(IDynamicDispatcherObj dispatcherObj)
 {
     return(this.Equals(dispatcherObj));
 }