Это не из-за BlockingCollection
или ConcurrentQueue
, а из-за цикла while:
while(socket.Connected)
{
while (!listOfQueueItems.IsEmpty)
{ /*code*/ }
}
Конечно, это опустит процессор; из-за того, что очередь пуста, цикл while выглядит так:
while (true) ;
, который в свою очередь съест ресурсы процессора.
Это не очень хороший способ использования ConcurrentQueue
, вы должны использовать с ним AutoResetEvent
, поэтому при каждом добавлении элемента вы будете получать уведомления.
Пример:
private ConcurrentQueue<Data> _queue = new ConcurrentQueue<Data>();
private AutoResetEvent _queueNotifier = new AutoResetEvent(false);
//at the producer:
_queue.Enqueue(new Data());
_queueNotifier.Set();
//at the consumer:
while (true)//or some condition
{
_queueNotifier.WaitOne();//here we will block until receive signal notification.
Data data;
if (_queue.TryDequeue(out data))
{
//handle the data
}
}
Для правильного использования BlockingCollection
вы должны использовать GetConsumingEnumerable()
для ожидания добавления элементов, например:
//declare the buffer
private BlockingCollection<Data> _buffer = new BlockingCollection<Data>(new ConcurrentQueue<Data>());
//at the producer method:
_messageBuffer.Add(new Data());
//at the consumer
foreach (Data data in _buffer.GetConsumingEnumerable())//it will block here automatically waiting from new items to be added and it will not take cpu down
{
//handle the data here.
}