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));
Foi útil?

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));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top