Ответ 1
Разве это не то, что BlockingCollection предназначен для?
Как я понимаю, вы можете обернуть свой ConcurrentQueue одним из них, а затем вызвать Take.
TryDequeue в ConcurrentQueue вернет false, если в очереди нет элементов.
Если очередь пуста, мне нужно, чтобы моя очередь дожидалась добавления нового элемента в очередь, и она деактивирует этот новый, и процесс будет продолжаться.
Должен ли я использовать monitor.enter, ждать, пульс или какие-либо лучшие варианты в С# 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(...);
}
}
Dequeue Thread:
while(true)
{
if(manualResetEvent.WaitOne(timeout))
{
DequeueUntilQueueEmpty();
}
}
Считайте также использование блокировки в DequeueUntilQueueEmpty.