Каковы различия между 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;
}
}
Ответы
Ответ 1
BlockingCollection
имеет метод Take
, который блокирует пользователя, если ему нечего делать, и ждать, пока сторона-производитель предоставит элемент. ConcurrentQueue
не хватает такого метода - если он пуст, потребитель должен будет обрабатывать ожидание, и продюсер должен будет предоставить непустое уведомление.