65

ConcurrentQueueBlockingCollection.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;
    }
}
4

2 に答える 2

65

BlockingCollection取るTakeものがない場合は消費者をブロックし、プロデューサー側がアイテムを提供するのを待つメソッドがあります。ConcurrentQueueにはそのようなメソッドがありません。空の場合、コンシューマーは待機を処理する必要があり、プロデューサーは空でない通知を提供する必要があります。

于 2012-04-04T12:10:44.677 に答える