2011-02-16 94 views
19

嘗試出隊的TryDequeue在ConcurrentQueue將返回如果隊列中沒有項目假的。在ConcurrentQueue

如果隊列是空的,我需要我的隊列會等到在隊列中添加新項目,並出列新的,過程中會繼續這樣。

我應該用monitor.enter,等待,脈衝或在C#4.0

+1

嗯 - 我很驚訝,這是不方便暴露 - 這似乎是一個常見的用例... –

+0

我想用4.0 BCL類應該公開,但如果不出意外的出現,也許關注一下。[這個答案](http://stackoverflow.com/questions/530211/creating-a-blocking-queuet-in-net/530228#530228),其中TryDequeue將阻塞,直到*任何*有一個項目(返回'true' )*或*隊列爲空並明確關閉(返回false) –

+0

如果隊列爲空,我需要我的線程將等待新隊列添加到隊列中,並將新隊列出隊,並且進程將繼續這樣下去。 –

回答

41

這不是什麼BlockingCollection是專爲?

據我瞭解,你可以用其中的一個包住ConcurrentQueue,然後調用Take

0

任何更好的選擇,你可以定期檢查隊列和元素的時候元素的數量大於零,你給一個數信號使用例如ManualResetEvent添加到將元素出隊的線程,直到隊列爲空。

下面是這個僞代碼:

檢查線程:

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

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

出列主題:

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

考慮在DequeueUntilQueueEmpty使用鎖了。

+0

實際上,我使用Monitor.enter,等待,pulseall使線程等待和信號。 ManualResetEvent是一個更好的選擇嗎? –

+0

其實我使用Monitor.enter,等待,使所有線程等待和信號。 ManualResetEvent是一個更好的選擇嗎? –

+0

ManualResetEvent是輕量級選項,Monitor是重量級選項。 –

相關問題