public void Reset() { _key = 0; _dispatcherObj = null; _status = EntryStatus.IDLE; _priority = EntryPriority.NORMAL; }
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); } } } }
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); } } }
/// <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); } }
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); }
/// <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); } }
public void AddDispatcherObj(int key, IDynamicDispatcherObj dispatcherObj, int priorty) { AddDispatcherObj(key, dispatcherObj, (DynamicDispatcherObjEntry.EntryPriority)priorty); }
public bool EqualOther(IDynamicDispatcherObj dispatcherObj) { return(this.Equals(dispatcherObj)); }