Параллельные коллекции потребляют слишком много процессора без Thread.Sleep

Каким будет правильное использование BlockingCollection или ConcurrentQueue , чтобы вы могли свободно удалять элементы из очереди, не сжигая половину или более вашего процессора с использованием потока?

Я запускал несколько тестов с использованием 2 потоков, и если бы у меня не было Thread.Sleep не менее 50 ~ 100 мс, он всегда загружал бы не менее 50% моего процессора.

Вот вымышленный пример:

private void _DequeueItem()
{
    object o = null;
    while(socket.Connected)
    {
        while (!listOfQueueItems.IsEmpty)
        {
            if (listOfQueueItems.TryDequeue(out o))
            {
                // use the data
            }
        }
    }
}

В приведенном выше примере мне пришлось бы установить thread.sleep, чтобы процессор не взорвался.

Примечание: я также пробовал это без проверки IsEmpty, результат был таким же.

12
задан Prix 1 July 2011 в 09:17
поделиться