thread - parallel.foreach example c#




Parallel.ForEach() vs. foreach(IEnumerable<T>.AsParallel()) (2)

A diferença é que B não é paralelo. A única coisa que o AsParallel() faz é que ele envolve um IEnumerable , de forma que quando você usa os métodos LINQ, suas variantes paralelas são usadas. O GetEnumerator() do wrapper (que é usado nos bastidores do foreach ) até retorna o resultado do GetEnumerator() da coleção original.

BTW, se você quiser examinar os métodos no Reflector, o AsParallel() está na classe System.Linq.ParallelEnumerable no assembly System.Core . Parallel.ForEach() está no assembly mscorlib (namespace System.Threading.Tasks ).

Erg, estou tentando encontrar esses dois métodos no 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 diferentes consequências de usar uma sobre a outra? (Suponha que o que quer que eu esteja fazendo nos corpos entre colchetes de ambos os exemplos seja thread-safe.)


Eles fazem algo bem diferente.

O primeiro leva o delegado anônimo e executa vários segmentos neste código em paralelo para todos os itens diferentes.

O segundo não é muito útil nesse cenário. Em suma, pretende-se fazer uma consulta em vários threads, combinar o resultado e devolvê-lo ao thread de chamada. Portanto, o código na instrução foreach permanece sempre no thread da interface do usuário.

Isso só faz sentido se você fizer algo caro na consulta linq à direita da chamada AsParallel() , como:

 var fibonacciNumbers = numbers.AsParallel().Select(n => ComputeFibonacci(n));




parallel.foreach