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?
Dies scheint jedoch Wiederholungen zu erzeugen:
%Vor%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% 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:
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.
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.
Tags und Links c# task ienumerable