2011-02-16 10 views
19

Il TryDequeue in ConcurrentQueue restituirà false se non ci sono elementi in Coda.Prova Dequeue in ConcurrentQueue

se la coda è vuota ho bisogno che la mia coda attenderà fino nuovo elemento da aggiungere in coda e si dequeue che nuova, e la volontà processo continua così.

Dovrei usare Monitor.Enter, attendere, impulsi o eventuali opzioni migliori in C# 4.0

+1

hmmm - mi sorprende che questo non sia convenientemente esposto - sembra un caso d'uso comune ... –

+0

Penso che con 4.0 una classe BCL dovrebbe esporre questo, ma se non appare nient'altro, forse guarda [a questo answer] (http://stackoverflow.com/questions/530211/creating-a-blocking-queuet-in-net/530228#530228), in cui TryDequeue bloccherà fino a quando * non * c'è un elemento (restituendo 'true') * o * la coda è vuota e si spegne esplicitamente (restituendo 'false') –

+0

Se la coda è vuota, è necessario che la mia discussione attenda fino a quando non viene aggiunto un nuovo elemento in coda e si abbandona quello nuovo, e il processo continua così. –

risposta

41

Non è questo per cui è progettato lo BlockingCollection?

Come ho capito, è possibile avvolgere ConcurrentQueue con uno di questi e quindi chiamare Take.

0

Si potrebbe verificare periodicamente il numero di elementi nella coda e quando il numero di elementi è maggiore di zero, si dà un segnale usando eg ManualResetEvent al thread che deseleziona l'elemento o gli elementi finché la coda non è vuota.

Ecco il codice per questo pseudo:

Controllare Discussione:

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

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

Dequeue Discussione:

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

considerare l'utilizzo di blocco nella DequeueUntilQueueEmpty, anche.

+0

In realtà im usando Monitor.enter, aspetta, pulseall per fare in modo che il thread attenda e segnali. ManualResetEvent è un'opzione migliore? –

+0

In realtà im usando Monitor.enter, aspetta, pulseall per fare in modo che il thread attenda e segnali. ManualResetEvent è un'opzione migliore? –

+0

ManualResetEvent è l'opzione leggera, Monitor è pesante. –

Problemi correlati