library - parallel programming in c#
Parallel.ForEach() vs. foreach(IEnumerable<T>.AsParallel()) (3)
El segundo método no será paralelo. La forma correcta de usar AsParallel () en su ejemplo sería
IEnumerable<string> items = ...
items.AsParallel().ForAll(item =>
{
//Do parallel stuff here
});
Erg, estoy tratando de encontrar estos dos métodos en el BCL usando Reflector, pero no puedo localizarlos. ¿Cuál es la diferencia entre estos dos fragmentos?
UN:
IEnumerable<string> items = ...
Parallel.ForEach(items, item => {
...
});
SEGUNDO:
IEnumerable<string> items = ...
foreach (var item in items.AsParallel())
{
...
}
¿Hay diferentes consecuencias de usar una sobre la otra? (Supongamos que lo que sea que esté haciendo en los cuerpos entre corchetes de ambos ejemplos es seguro para subprocesos).
Ellos hacen algo bastante diferente.
El primero toma el delegado anónimo y ejecuta varios hilos en este código en paralelo para todos los diferentes elementos.
El segundo no es muy útil en este escenario. En pocas palabras, está destinado a hacer una consulta sobre múltiples hilos, y combinar el resultado, y darle nuevamente a la cadena de llamada. Entonces, el código en la declaración foreach permanece siempre en el hilo de la interfaz de usuario.
Solo tiene sentido si hace algo costoso en la consulta de linq a la derecha de la llamada AsParallel()
, como:
var fibonacciNumbers = numbers.AsParallel().Select(n => ComputeFibonacci(n));
La diferencia es que B no es paralelo. Lo único que hace AsParallel()
es que envuelve un IEnumerable
, de modo que cuando utiliza los métodos LINQ, se usan sus variantes paralelas. El GetEnumerator()
envoltorio (que se utiliza detrás de las escenas en el foreach
) incluso devuelve el resultado del GetEnumerator()
de la colección original.
Por cierto, si desea ver los métodos en Reflector, AsParallel()
está en la clase System.Linq.ParallelEnumerable
en el ensamblado System.Core
. Parallel.ForEach()
está en el ensamblado mscorlib
(namespace System.Threading.Tasks
).