BlockingCollection oder QueueT für Jobs?

8

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?

    
syncis 23.08.2011, 12:35
quelle

2 Antworten

14

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

  1. Es ist Thread-sicher

  2. 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.

Jonathan Beerhalter 23.08.2011, 12:39
quelle
0

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).

    
Yahia 23.08.2011 12:50
quelle

Tags und Links