He tenido el siguiente código en mi aplicación durante algunos años y nunca he visto un problema.Colas de espera y colas en C#
while ((PendingOrders.Count > 0) || (WaitHandle.WaitAny(CommandEventArr) != 1))
{
lock (PendingOrders)
{
if (PendingOrders.Count > 0)
{
fbo = PendingOrders.Dequeue();
}
else
{
fbo = null;
}
}
// Do Some Work if fbo is != null
}
Dónde CommandEventArr se compone de la NewOrderEvent (un evento de reinicio automático) y el ExitEvent (un evento de rearme manual).
Pero no estoy seguro de si esto es seguro para subprocesos (suponiendo N hilos de productor que bloquean la cola antes de enqueing y un hilo de consumidor que ejecuta el código anterior). Además, podemos suponer que la propiedad Queue.Count simplemente devuelve un valor de Int32 de instancia de la clase Queue (sin volátil o interbloqueado o un bloqueo, etc.).
¿Cuál es el patrón habitual utilizado con una Cola y un AutoResetEvent para solucionar esto y hacer lo que estoy tratando de hacer con el código anterior?
(Modificado para cambiar la pregunta un poco después de haber sido señalado correctamente que Queue.Count podría hacer algo y su implementación específica).
Seguramente este lazo está incrustado en algún tipo de bucle externo (en funcionamiento) - ¿no es por eso que funciona bien? –
No, no hay otro ciclo. Solo hay un hilo que bloquea la cola y encola las órdenes y luego establece NewOrderEvent. –