Ich brauche, um eine FIFO-Warteschlange für Nachrichten auf einem Spiel-Server zu implementieren, so dass es so schnell wie möglich muss. Es wird eine Warteschlange für jeden Benutzer sein.
Die Warteschlange wird eine maximale Größe haben (sagen wir 2000). Die Größe wird sich während der Laufzeit nicht ändern.
Ich muss Nachrichten NUR dann priorisieren, wenn die Warteschlange ihre maximale Größe erreicht, indem ich rückwärts arbeite und eine Nachricht mit niedrigerer Priorität (falls vorhanden) entferne, bevor ich die neue Nachricht hinzufüge.
Eine Priorität ist ein int mit möglichen Werten von 1, 3, 5, 7, 10.
Es kann mehrere Nachrichten mit der gleichen Priorität geben.
Eine einmal zugewiesene Nachricht kann ihre Priorität nicht mehr ändern.
Da die Anwendung asynchron arbeitet, muss der Zugriff auf die Warteschlange gesperrt werden.
Ich bin derzeit implementieren es mit einem LinkedList als die zugrunde liegende Speicherung, aber haben Bedenken, dass das Suchen und Entfernen von Knoten wird es zu lange gesperrt halten.
Hier ist der grundlegende Code, den ich im Moment habe:
public class ActionQueue
{
private LinkedList<ClientAction> _actions = new LinkedList<ClientAction>();
private int _maxSize;
/// <summary>
/// Initializes a new instance of the ActionQueue class.
/// </summary>
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<ClientAction> 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;
}
}