62 votes

Quelles sont les différences entre ConcurrentQueue et BlockingCollection dans .Net ?

Quelles sont les différences entre ConcurrentQueue et BlockingCollection dans .Net ?

Pourquoi BlockingCollection est le meilleur pour le fonctionnement producteur-consommateur alors qu'il peut être fait par ConcurrentQueue ? Dois-je améliorer quelque chose dans le code suivant ?

 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;
    }
}

62voto

dasblinkenlight Points 264350

BlockingCollection a une Take qui bloquerait le consommateur s'il n'y a rien à prendre, et attendrait qu'un côté producteur fournisse un article. ConcurrentQueue ne dispose pas d'une telle méthode - si elle est vide, le consommateur devra gérer l'attente et le producteur devra fournir une notification non vide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X