嘗試出隊的TryDequeue在ConcurrentQueue將返回如果隊列中沒有項目假的。在ConcurrentQueue
如果隊列是空的,我需要我的隊列會等到在隊列中添加新項目,並出列新的,過程中會繼續這樣。
我應該用monitor.enter,等待,脈衝或在C#4.0
嘗試出隊的TryDequeue在ConcurrentQueue將返回如果隊列中沒有項目假的。在ConcurrentQueue
如果隊列是空的,我需要我的隊列會等到在隊列中添加新項目,並出列新的,過程中會繼續這樣。
我應該用monitor.enter,等待,脈衝或在C#4.0
這不是什麼BlockingCollection是專爲?
據我瞭解,你可以用其中的一個包住ConcurrentQueue,然後調用Take。
任何更好的選擇,你可以定期檢查隊列和元素的時候元素的數量大於零,你給一個數信號使用例如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使用鎖了。
實際上,我使用Monitor.enter,等待,pulseall使線程等待和信號。 ManualResetEvent是一個更好的選擇嗎? –
其實我使用Monitor.enter,等待,使所有線程等待和信號。 ManualResetEvent是一個更好的選擇嗎? –
ManualResetEvent是輕量級選項,Monitor是重量級選項。 –
嗯 - 我很驚訝,這是不方便暴露 - 這似乎是一個常見的用例... –
我想用4.0 BCL類應該公開,但如果不出意外的出現,也許關注一下。[這個答案](http://stackoverflow.com/questions/530211/creating-a-blocking-queuet-in-net/530228#530228),其中TryDequeue將阻塞,直到*任何*有一個項目(返回'true' )*或*隊列爲空並明確關閉(返回false) –
如果隊列爲空,我需要我的線程將等待新隊列添加到隊列中,並將新隊列出隊,並且進程將繼續這樣下去。 –