Ha Parallel.ForEach richiede AsParallel ()
-
20-09-2019 - |
Domanda
ParallelEnumerable
ha un AsParallel
membro statico. Se ho un IEnumerable<T>
e voglio usare Parallel.ForEach
vuol implica che io debba sempre utilizzerò AsParallel
?
es. Sono entrambi questi corretta (tutto il resto è uguale)?
senza AsParallel
:
List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)), f => list.Add(f));
o con AsParallel
?
List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)).AsParallel(), f => list.Add(f));
Soluzione
Dipende da quello che viene chiamato, sono questioni separate.
.AsParallel()
parallelizza enumerazione non delega delle funzioni.
Parallel.ForEach
parallelizzata ciclo , l'assegnazione di compiti a thread di lavoro per ogni elemento.
Quindi, a meno che i sorgenti di enumerazione guadagni da diventare parallelo (ad esempio reader.Match(file)
è costoso), sono uguali. Alla sua ultima domanda, Sì , entrambi sono anche corretta.
Inoltre, c'è un altro costrutto si consiglia di guardare in che accorcia un po ', ancora ottenere il massimo beneficio di PLINQ:
GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f));