Necesito implementar una cola FIFO para los mensajes en un servidor de juego, por lo que necesita hacerlo lo más rápido posible. Habrá una cola para cada usuario.¿Cuál es la colección más rápida en C# para implementar una cola de priorización?
La cola tendrá un tamaño de maxiumem (digamos 2000). El tamaño no cambiará durante el tiempo de ejecución.
Necesito priorizar los mensajes SÓLO si la cola alcanza su tamaño máximo trabajando hacia atrás y eliminando un mensaje de prioridad más baja (si existe) antes de agregar el nuevo mensaje.
Una prioridad es un int con posibles valores de 1, 3, 5, 7, 10.
No pueden ser mensajes múltiples con la misma prioridad.
Un mensaje no puede cambiar su prioridad una vez asignado.
La aplicación es asincrónica, por lo que debe bloquearse el acceso a la cola.
Actualmente lo estoy implementando usando LinkedList como el almacenamiento subyacente, pero me preocupa que la búsqueda y eliminación de nodos lo mantendrá bloqueado por mucho tiempo.
Heres el código básico que tienen en la actualidad
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;
}
}
No hay suficiente información en mi opinión. ¿Las prioridades son limitadas o ilimitadas? ¿Su cola tendrá unos 10 o elementos o potencialmente 10 de 1000? ¿Necesita una cola de prioridad mutable o una inmutable? ¿Puede enumerar algunas operaciones compatibles y la complejidad computacional deseada? ¿Es necesario admitir operaciones en tiempo real o se amortiza O (1) como aceptable? etc. – Juliet
¿Son estas prioridades fijas y cuál es su rango? – RBarryYoung
@Juliet: Ha. Pregunto a las personas en las entrevistas "¿Cómo implementarías una cola de prioridad?" todo el tiempo. La mayoría de las personas lo hacen, pero nunca preguntan sobre el rango de prioridades, la cantidad de artículos o el costo que deben tener las operaciones. ¡Tú, mi amigo, estás contratado! :) se añadieron 3,5 –