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

Каковы различия между ConcurrentQueue и BlockingCollection в .NET?

В чем разница между ConcurrentQueue и BlockingCollection в .Net?

Почему BlockingCollection лучше всего подходит для работы с производителем-потребителем, когда это можно сделать через ConcurrentQueue? Мне нужно что-то улучшить в следующем коде?

MessageSlotMachineGameStartOrAndStatusUpdate msg;

while (!aCancellationToken.IsCancellationRequested)
{
    try
    {
        this.isStillConsumingMsg = true;
        Boolean takeResult = this.msgQueue.TryTake(out msg, this.msgConsumeTimeOut, aCancellationToken);
        if (takeResult)
        {
            if (msg != null)
            {
                this.ProcessMessage(msg);
            }
        }
        else
        {
            break;
        }
    }
    catch (OperationCanceledException err)
    {
        EngineManager.AddExceptionLog(err, "Signal Operation Canceled");
    }
    catch (Exception err)
    {
        EngineManager.AddExceptionLog(err, "Signal exception");
    }
    finally
    {
        this.isStillConsumingMsg = false;
    }
}
4b9b3361

Ответ 1

BlockingCollection имеет метод Take, который блокирует пользователя, если ему нечего делать, и ждать, пока сторона-производитель предоставит элемент. ConcurrentQueue не хватает такого метода - если он пуст, потребитель должен будет обрабатывать ожидание, и продюсер должен будет предоставить непустое уведомление.