Wie können mehrere Threads dasselbe IEnumerable-Ergebnis verarbeiten?

8

Ich habe eine Methode, die eine IEnumerable<string> zurückgibt, die natürlich mit yield return <string>; behandelt wird. Ich möchte mehrere Threads haben, die das Ergebnis verarbeiten, natürlich ohne es zu wiederholen und Thread-sicher zu sein. Wie würde ich das erreichen?

%Vor%

Dies scheint jedoch Wiederholungen zu erzeugen:

%Vor%     
esac 23.02.2011, 04:43
quelle

3 Antworten

9

Sie können dies einfach mit der Parallel.ForEach-Methode durchführen.

Schreiben Sie eine einfache Parallel.ForEach-Schleife

Jede Iteration wird im Task-Manager in die Warteschlange gestellt. Die Schleife wird beendet, wenn alle Iterationen ausgeführt werden.

%Vor%     
Josh 23.02.2011, 04:47
quelle
4

Sie müssen für jeden ProcessCopy() -Aufruf einen Bereich von Elementen auswählen - im Moment übergeben Sie jedem Thread die vollständige Aufzählung von Dateien - denken Sie daran, dass das IEnumerable , das Sie übergeben, eine Methode namens GetEnumerator() - nur wenn Diese Methode wird aufgerufen (was die foreach für Sie unter der Haube tut), die echte Enumerator wird zurückgegeben, mit der Sie die Elemente nacheinander aufzählen können. Da Sie IEnumerable übergeben, ruft jeder Thread GetEnumerator() auf und zählt alle Dateien auf.

Stattdessen tun Sie so etwas, damit jeder ProcessCopy() eine Datei verarbeitet:

%Vor%

Ich würde mir keine Sorgen über die Prozessoranzahl machen - lassen Sie die TPL und den Thread-Pool herausfinden, wie viele Threads für eine optimale Leistung ausgeführt werden sollen.

    
BrokenGlass 23.02.2011 04:47
quelle
1

Warum verwenden Sie nicht eine einfache LINQ-Abfrage, um das zu tun, was Sie wollen?

%Vor%

Hinter den Kulissen behandelt TPL sowieso alle icky Environment.ProcessorCount Sachen.

    
Enigmativity 23.02.2011 05:15
quelle

Tags und Links