2011-02-16 16 views
19

ConcurrentQueue'daki TryDequeue, Kuyrukta öğe yoksa false değerini döndürür.ConcurrentQueue'da Dequeue'u Deneyin

Kuyruk boşsa Sıranın yeni öğenin sıraya eklenmesini bekleyip sıraya girmesini beklemeli ve bu yenisini düşürmeli ve işlem bu şekilde devam edecektir.

i Monitor.Enter kullanmalıyım, bekle darbe veya C# 4.0

+1

hmmm - bu uygun bir şekilde açığa çıkmadığında beni şaşırtıyor - bu yaygın bir kullanım çantası gibi görünüyor ... –

+0

Sanırım 4.0 ile BCL sınıfı bunu ortaya çıkarmalı, ama başka bir şey görünmüyorsa, belki de answer] (http://stackoverflow.com/questions/530211/creating-a-blocking-queuet-in-net/530228#530228), burada TryDequeue, * bir * öğeyi ("true" döndürerek) * veya * sıra boştur ve açıkça kapatılır ('false' döndürme) –

+0

Kuyruk boşsa, iş parçacığım sıraya eklenecek kadar yeni öğeyi beklemeli ve bu yenisini deşarj etmelidir. böyle devam ediyor. –

cevap

41

BlockingCollection bunun için tasarlanmamış mıdır?

Anladığım kadarıyla ConcurrentQueue'nizi bunlardan biriyle sarın ve sonra Take'u arayın.

0

herhangi iyi seçenekler periyodik öğe sayısı sıfırdan büyük olduğu zaman, bir vermek kuyrukta ve elemanların sayısını kontrol edebilir örneğin kullanarak sinyal Sırası boş olana kadar öğeyi/öğeleri deşifre eden vida dişine ManualResetEvent.

Kontrol Konu:

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

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

Dequeue Konu:

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

de DequeueUntilQueueEmpty kilidi kullanmayı düşünün Burada

Bunun sözde kodudur.

+0

Aslında Monitor.enter kullanıyorum, iş parçacığının bekleyip sinyal vermesini bekleyin. ManualResetEvent daha iyi bir seçenek midir? –

+0

Aslında Monitor.enter kullanıyorum, iş parçacığının bekleyip sinyal vermesini bekleyin. ManualResetEvent daha iyi bir seçenek midir? –

+0

ManualResetEvent hafif bir seçenektir, Monitör çok ağırdır. –

İlgili konular