Ich entwickle eine Windows-Formularanwendung (c #), und während das Programm läuft, erstellt es Objekte, fügt sie zu einer Liste hinzu. Ich muss die Einträge in der Liste mit FIFO (first in first out) bearbeiten. Ich möchte dies in einem Hintergrundthread tun und ich muss sie in der Reihenfolge, Nummer 1, Nummer 2, Nummer 3 und so weiter verarbeiten. Und sobald ein Artikel zur Liste hinzugefügt wird, möchte ich ihn bearbeiten. Also muss ich etwas haben, um diese Liste zu überprüfen.
Was ist der beste Weg, dies zu erreichen?
Ich weiß, dass blockingcollection etwas Ähnliches tut, dass es darauf wartet, dass ein Element hinzugefügt wird, bevor es verarbeitet wird.
Ich kann einen einzelnen Thread mit der Warteschlange verwenden und nur während (wahr) und Elemente nehmen, wenn es welche gibt?
Was denkst du?
Klingt so, als sollten Sie sich für die BlockingCollection<T>
entscheiden, wenn Sie die Verwendung planen ein Hintergrundfaden. Sie können ziemlich einfach die gleiche while(true)
Logik erstellen, nach der Sie suchen.
Das BlockingCollection<T>
gibt Ihnen zwei wichtige Funktionen
Es ist Thread-sicher
Wenn Sie Take()
aufrufen, wird es blockiert (dh warten bis etwas ist in der Warteschlange) für Sie, so dass Sie keinen Code mit schreiben müssen ManualResetEvents
und dergleichen, was eine nette Vereinfachung ist.
Wenn Sie blockieren möchten, wenn die Warteschlange leer ist, dann verwenden Sie BlockingCollection
- es ist ideal ...
WENN du es mehr Queue-artig willst (entscheide selbst wie man mit einem leeren handelt) dann ConcurrentQueue
.
Beide sind Thread-sicher, in ConcurrentQueue
die meisten Operationen sind Lock-Free also sehr schnell implementiert ... entweder verwenden Sie es direkt oder als Basistyp für Ihre BlockingCollection
zum Beispiel BlockingCollection<string> = new BlockingCollection<string> (new ConcurrentQueue<string>)
- Sie können sogar Setzen Sie eine maximale Kapazität darauf (optionaler zweiter Parameter des Konstruktors).
Tags und Links .net c# collections jobs