Gewusst wie: Entfernen von Elementen in einer BlockingCollection mit ForEach

Zusätzlich zum Entnehmen von Elementen aus einer BlockingCollection<T> mithilfe der Methoden Take und TryTake können Sie auch eine foreach (For Each in Visual Basic) verwenden, um Elemente zu entfernen, bis der Hinzufügevorgang abgeschlossen und die Auflistung leer ist. Dies wird als mutierende Enumeration oder verbrauchende Enumeration bezeichnet, da dieser Enumerator, im Gegensatz zu einer typischen foreach- (For Each-)Schleife, die Quellsammlung durch Entfernen von Elementen verändert.

Beispiel

Das folgende Beispiel zeigt das Entfernen aller Elemente in einer BlockingCollection<T> mithilfe einer foreach-Schleife (For Each).

[!code-csharpCDS_BlockingCollection#03] [!code-vbCDS_BlockingCollection#03]

Dieses Beispiel verwendet eine foreach-Schleife mit der BlockingCollection<T>.GetConsumingEnumerable-Methode im verbrauchenden Thread, wodurch jedes Element beim Aufzählen aus der Auflistung entfernt wird. System.Collections.Concurrent.BlockingCollection<T> begrenzt die maximale Anzahl von Elementen, die sich zu einem bestimmten Zeitpunkt in der Sammlung befinden können. Durch Aufzählen der Auflistung auf diese Weise wird der Consumerthread blockiert, wenn keine Elemente verfügbar sind oder die Auflistung leer ist. In diesem Beispiel ist eine Blockierung kein Problem, da der Producerthread Elemente schneller hinzufügt als sie verbraucht werden können.

Es gibt keine Garantie dafür, dass die Elemente in der gleichen Reihenfolge aufgezählt werden, in der sie von den Producerthreads hinzugefügt werden.

Um die Auflistung aufzuzählen, ohne sie zu verändern, verwenden Sie einfach foreach (For Each) ohne die GetConsumingEnumerable-Methode. Es ist jedoch wichtig zu wissen, dass diese Art der Enumeration eine Momentaufnahme der Auflistung zu einem genauen Zeitpunkt darstellt. Wenn weitere Threads gleichzeitig Elemente hinzufügen oder entfernen, während die Schleife ausgeführt wird, stellt die Schleife möglicherweise nicht den tatsächlichen Zustand der Auflistung dar.

Siehe auch

System.Collections.Concurrent
Parallele Programmierung