Parallel.foreach requer asparalle ()
-
20-09-2019 - |
Pergunta
ParallelEnumerable
tem um membro estático AsParallel
. Se eu tiver um IEnumerable<T>
e quero usar Parallel.ForEach
Isso implica que eu sempre deveria estar usando AsParallel
?
por exemplo, ambos estão corretos (tudo o mais é igual)?
sem AsParallel
:
List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)), f => list.Add(f));
ou com AsParallel
?
List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)).AsParallel(), f => list.Add(f));
Solução
Depende do que está sendo chamado, são questões separadas.
.AsParallel()
Paralelize o enumeração não a delegação de tarefas.
Parallel.ForEach
Paralelo ao ciclo, atribuindo tarefas aos threads do trabalhador para cada elemento.
Portanto, a menos que sua enumeração de origem ganhe de se tornar paralelo (por exemplo reader.Match(file)
é caro), eles são iguais. Para sua última pergunta, sim, ambos também estão corretos.
Além disso, há outro construto que você pode querer analisar um pouco, ainda obtendo o máximo benefício do PLINQ:
GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f));