Was sind die Unterschiede zwischen ConcurrentQueue und BlockingCollection in .Net?
Was sind die Unterschiede zwischen ConcurrentQueue
und BlockingCollection
im .Net?
Warum BlockingCollection
ist am besten für die Erzeuger-Verbraucher-operation, wenn es getan werden kann, durch ConcurrentQueue
? Muss ich noch etwas verbessern in dem folgenden code?
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 verwendet CurrentQueue als der zugrunde liegende Typ, um die Daten aufzunehmen. Plus es hat die Blockierung der Funktionalität.
- auch nur Hinweis BlockingCollection verwendet ConcurrentQueue standardmäßig, aber Sie können geben Sie einen anderen collection-Typ im Konstruktor implementiert, dass IProducerConsumerCollection...zum Beispiel, wenn Sie wollten, LIFO könnten Sie eine ConcurrentStack statt
Du musst angemeldet sein, um einen Kommentar abzugeben.
BlockingCollection
hat eineTake
Methode blockieren würden die Verbraucher, wenn es nichts zu nehmen, und warten, bis ein Erzeuger-Seite, um ein Element.ConcurrentQueue
fehlt eine solche Methode - wenn es leer ist, wird der Verbraucher behandeln müssen, das warten, und die Hersteller benötigen, um eine nicht-leere Meldung.AutoResetEvent
. Folgen Sie dem link und scrollen Sie nach unten für ein Beispiel wie es verwendet wird.BlockingCollection
wickeltConcurrentQueue
, so dass die Antwort ist "ja". Jedoch, Sie können bauenBlockingCollection
Objekte mit anderen Sammlungen, die innerhalb Sie zum ändern der Reihenfolge von "nehmen".