一千萬個為什麽

搜索

c#中實現優先級排隊隊列的最快集合是什麽?

我需要為遊戲服務器上的消息實現FIFO隊列,因此它需要盡可能快。每個用戶都會有一個隊列。

隊列將具有maxiumem大小(比方說2000)。在運行時,大小不會改變。

如果隊列達到其最大大小,我需要優先處理消息,方法是在添加新消息之前向後工作並刪除較低優先級的消息(如果存在)。

優先級是int,可能的值為1,3,5,7,10。

可以有多條具有相同優先級的消息。

一旦分配,消息就不能改變其優先級。

應用程序是異步的,因此需要鎖定對隊列的訪問。

我目前正在使用LinkedList作為底層存儲來實現它,但是擔心搜索和刪除節點會使其鎖定時間過長。

這是我目前的基本代碼:

public class ActionQueue
{
    private LinkedList _actions = new LinkedList();
    private int _maxSize;

    /// 
/// Initializes a new instance of the ActionQueue class. ///
 
    public ActionQueue(int maxSize)
    {
        _maxSize = maxSize;
    }

    public int Count
    {
        get { return _actions.Count; }            
    }

    public void Enqueue(ClientAction action)
    {
        lock (_actions)
        {
            if (Count < _maxSize)
                _actions.AddLast(action);
            else
            {
                LinkedListNode node = _actions.Last;
                while (node != null)
                {
                    if (node.Value.Priority < action.Priority)
                    {
                        _actions.Remove(node);
                        _actions.AddLast(action);
                        break;
                    }

                    node = node.Previous;

                }                    
            }
        }
    }

    public ClientAction Dequeue()
    {
        ClientAction action = null;

        lock (_actions)
        {
            action = _actions.First.Value;
            _actions.RemoveFirst();
        }

        return action;
    }

}

最佳答案

A vetted implementation of priority queue for C#/.NET can be found in the C5 Generic Collection Library in the C5.IntervalHeap class.

轉載註明原文: c#中實現優先級排隊隊列的最快集合是什麽?