.Net中ConcurrentQueue
和BlockingCollection
之间有什么区别?
为什么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;
}
}
答案 0 :(得分:46)
BlockingCollection
有一个Take
方法,如果没有任何东西可以阻止消费者,并等待生产者方提供一个项目。 ConcurrentQueue
缺少这样的方法 - 如果它是空的,消费者将需要处理等待,并且生产者需要提供非空通知。