.Net中的ConcurrentQueue和BlockingCollection有什么区别?

时间:2012-04-04 12:06:59

标签: .net generics c#-4.0

.Net中ConcurrentQueueBlockingCollection之间有什么区别?

为什么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 个答案:

答案 0 :(得分:46)

BlockingCollection有一个Take方法,如果没有任何东西可以阻止消费者,并等待生产者方提供一个项目。 ConcurrentQueue缺少这样的方法 - 如果它是空的,消费者将需要处理等待,并且生产者需要提供非空通知。