2014-09-26 10 views
7

I wan't eine Liste von mehreren BlockingCollectionsIst eine Liste <BlockingCollection <T>> Thread sicher?

List<BlockingCollection<ExtDocument>> a = new List<BlockingCollection<ExtDocument>>(); 

und die Prüfung in subthreads zu halten, wenn eine der ‚Warteschlangen‘ noch Produkte haben anhängig:

if (a.Where(x => x.IsAddingCompleted).Count > 0) 

Ist die Verwendung eines List<T> in diesem Fall Thread-sicher , wenn die Anzahl der Elemente in der Liste nicht nach der Initialisierung ändern (der Inhalt der blockinglists in der Sammlung wird sich natürlich ändern ...)?

Oder sollte ich entscheiden sich für eine array of BlockingCollection oder die folgende Konstruktion:

BlockingCollection<BlockingCollection<workitem>> a = new BlockingCollection<BlockingCollection<workitem>>(); 
+7

Wenn sich die Liste nach der Initialisierung nicht ändert, ist es vollkommen in Ordnung, nur eine Liste zu verwenden. Nur das Lesen ist nicht das Problem der Nebenläufigkeit, es ist seine Veränderlichkeit, die es schließlich zu einem Problem macht. – Caramiriel

+6

Ich würde lieber ein Array anstelle von 'List ' verwenden. Auf diese Weise wird deutlich, dass sich die Anzahl der Elemente nicht ändert. – CodesInChaos

+0

@Caramiriel Vielen Dank für die Information! CodesInChaos: Danke für den Tipp. Dies wird in der Tat die Lesbarkeit für zukünftige Programmierer erhöhen – User999999

Antwort

7

Ein schöner Vorteil ein Array statt List<T> verwenden, ist, dass man dann BlockingCollection<T>.TakeFromAny und ähnliche Methoden verwenden können. Höchstwahrscheinlich nähern Sie sich Ihrem Problem aus dem falschen Blickwinkel - Ihre Verarbeitungs-Threads könnten dann einfach BlockingCollection<T>.TryTakeFromAny, und wenn es falsch ist, sind Sie fertig. Völlig thread-sicher und ziemlich gut. Ihre Verarbeitungsschleife sieht also ungefähr so ​​aus:

+0

Ganz in der Tat. Ich muss das auf der msdn-Seite gelesen haben. Werde es in Kürze testen! – User999999

+0

In der Tat viel besser als der Code, den ich bis jetzt hatte. Thnx! – User999999

Verwandte Themen