Подтвердить что ты не робот

Попробуйте Dequeue в ConcurrentQueue

TryDequeue в ConcurrentQueue вернет false, если в очереди нет элементов.

Если очередь пуста, мне нужно, чтобы моя очередь дожидалась добавления нового элемента в очередь, и она деактивирует этот новый, и процесс будет продолжаться.

Должен ли я использовать monitor.enter, ждать, пульс или какие-либо лучшие варианты в С# 4.0

4b9b3361

Ответ 1

Разве это не то, что BlockingCollection предназначен для?

Как я понимаю, вы можете обернуть свой ConcurrentQueue одним из них, а затем вызвать Take.

Ответ 2

Вы можете периодически проверять количество элементов в очереди и когда количество элементов больше нуля, вы даете сигнал, например, 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.