Ist parallel.foreach erfordert Asparallel ()
-
20-09-2019 - |
Frage
ParallelEnumerable
Hat ein statisches Mitglied AsParallel
. Wenn ich eine habe IEnumerable<T>
und wollen benutzen Parallel.ForEach
bedeutet das, dass ich immer verwenden sollte AsParallel
?
ZB sind beide richtig (alles andere ist gleich)?
ohne AsParallel
:
List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)), f => list.Add(f));
oder mit AsParallel
?
List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)).AsParallel(), f => list.Add(f));
Lösung
Es hängt davon ab, was genannt wird, sie sind getrennte Probleme.
.AsParallel()
Parallel von der Aufzählung Nicht die Delegation von Aufgaben.
Parallel.ForEach
Parallel zu Schleife, Zuweisen von Aufgaben an Arbeitsthreads für jedes Element.
Sofern Ihre Quelle, es sei denn, Sie werden parallel (z. reader.Match(file)
ist teuer), sie sind gleich. Zu Ihrer letzten Frage, Jawohl, beide sind auch korrekt.
Außerdem gibt es noch ein weiteres Konstrukt, das Sie sich vielleicht ein wenig ansehen möchten und immer noch einen maximalen Nutzen von Plinq erhalten:
GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f));