Erg, estou tentando encontrar esses dois métodos na BCL usando o Reflector, mas não consigo localizá-los. Qual é a diferença entre esses dois trechos?
UMA:
IEnumerable<string> items = ...
Parallel.ForEach(items, item => {
...
});
B:
IEnumerable<string> items = ...
foreach (var item in items.AsParallel())
{
...
}
Existem consequências diferentes do uso de um sobre o outro? (Suponha que tudo o que estou fazendo nos corpos entre colchetes dos dois exemplos seja seguro para threads.)
fonte
A diferença é que B não é paralelo. A única coisa que
AsParallel()
faz é envolver um aIEnumerable
, para que, quando você use os métodos LINQ, suas variantes paralelas sejam usadas. O invólucroGetEnumerator()
(que é usado nos bastidores noforeach
) até retorna o resultado da coleção originalGetEnumerator()
.BTW, se você quiser examinar os métodos no Refletor,
AsParallel()
está naSystem.Linq.ParallelEnumerable
classe naSystem.Core
montagem.Parallel.ForEach()
está namscorlib
montagem (espaço para nomeSystem.Threading.Tasks
).fonte
.Select()
, chamaParallelEnumerable.Select()
e não o normalEnumerable.Select()
.O segundo método não será paralelo, a maneira correta de usar AsParallel () no seu exemplo seria
fonte