2011-02-16 21 views
19

El TryDequeue en ConcurrentQueue devolverá falso si no hay elementos en cola.Pruebe Dequeue en ConcurrentQueue

Si la cola está vacía, necesito que mi cola espere hasta que se agregue el nuevo elemento en la cola y que quite la cola de ese nuevo, y el proceso continuará así.

debo usar Monitor.Enter, espera, pulso o cualquier mejores opciones en C# 4.0

+1

hmmm - me sorprende que esto no esté expuesto de manera conveniente - parece ser un caso de uso común ... –

+0

Creo que con 4.0 una clase BCL debería exponer esto, pero si no aparece nada más, quizás mire [en este respuesta] (http://stackoverflow.com/questions/530211/creating-a-blocking-queuet-in-net/530228#530228), en el que TryDequeue bloqueará hasta que * cualquiera * haya un elemento (devuelva 'verdadero') * o * la cola está vacía y se cierra explícitamente (devolviendo 'false') –

+0

Si la cola está vacía, necesito que mi subproceso espere hasta que se agregue un nuevo elemento en la cola y que dequeue el nuevo, y el proceso continúa así. –

Respuesta

41

¿No es esto para lo que BlockingCollection está diseñado?

Según tengo entendido, puede ajustar su ConcurrentQueue con uno de estos, y luego llamar al Take.

0

podrías comprobar periódicamente el número de elementos en la cola y cuando el número de elementos es mayor que cero, usted da una señal usando, por ejemplo, ManualResetEvent al hilo que dequeue los elementos hasta que la cola esté vacía.

Aquí es el pseudo código para esto:

Comprobar Tema:

while(true) 
{ 
    int QueueLength = 0; 
    lock(Queue) 
    { 
    queueLength = Queue.Length; 
    } 

    if (Queue.Length > 0) 
    { 
    manualResetEvent.Set(); 
    } 
    else 
    { 
    Thread.Sleep(...); 
    }  
}  

quitar de la cola del hilo:

while(true) 
{ 
    if(manualResetEvent.WaitOne(timeout)) 
    { 
    DequeueUntilQueueEmpty(); 
    } 
} 

considerar el uso de bloqueo en el DequeueUntilQueueEmpty, también.

+0

En realidad estoy usando Monitor.enter, wait, pulseall para que el hilo espere y señalice. ¿Es ManualResetEvent una mejor opción? –

+0

En realidad estoy usando Monitor.enter, espere, pulseall para hacer que el hilo espere y señal. ¿Es ManualResetEvent una mejor opción? –

+0

ManualResetEvent es una opción liviana, el Monitor es pesado. –

Cuestiones relacionadas