public IMessage PublishByNumber(Type type, IEventArgs args, int priority = MessageUrgency.Common) { var message = Framework.GlobalAllocate <Message>(); message.Begin(); message.SetArgs(args).SetType(type); if (priority < 0) { HandleMessage(message); } else { using (new LockWait(ref _lock_message)) { if (_priorityQueue.count == _priorityQueue.capcity) { _priorityQueue.Resize(_priorityQueue.capcity * 2); } StablePriorityQueueNode node = Framework.GlobalAllocate <StablePriorityQueueNode>(); _priorityQueue.Enqueue(node, priority); excuteMap.Add(node, message); _updatelist.Add(node); } } return(message); }
public void Update() { int count = 0; Queue <Message> _tmp = Framework.GlobalAllocate <Queue <Message> >(); using (new LockWait(ref _lock_message)) { count = processesPerFrame == -1 ? _priorityQueue.count : Math.Min(processesPerFrame, _priorityQueue.count); if (count == 0) { return; } for (int i = 0; i < count; i++) { StablePriorityQueueNode node = _priorityQueue.Dequeue(); Message message; if (excuteMap.TryGetValue(node, out message)) { _tmp.Enqueue(message); excuteMap.Remove(node); } _updatelist.Remove(node); node.GlobalRecyle(); } if (_updatelist.Count > 0) { for (int i = _updatelist.Count - 1; i >= 0; i--) { _priorityQueue.UpdatePriority(_updatelist[i], _updatelist[i].priority - 1); } } } for (int i = 0; i < count; i++) { var message = _tmp.Dequeue(); HandleMessage(message); } _tmp.GlobalRecyle(); }