【发布时间】:2012-04-18 03:20:23
【问题描述】:
.Net 中ConcurrentQueue 和BlockingCollection 有什么区别?
当可以通过ConcurrentQueue 完成时,为什么BlockingCollection 最适合生产者-消费者操作?我是否需要改进以下代码中的任何内容?
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;
}
}
【问题讨论】:
-
BlockingCollection 使用 CurrentQueue 作为底层类型来保存数据。此外,它还具有阻止功能。
-
还要注意 BlockingCollection 默认使用 ConcurrentQueue,但是您可以在实现 IProducerConsumerCollection 的构造函数中指定另一个集合类型...例如,如果您想要 LIFO,您可以指定一个 ConcurrentStack 来代替