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();
            }