Pregunta

Erg, estoy tratando de encontrar estos dos métodos en el BCL utilizando reflector, pero no puede localizarlos. ¿Cuál es la diferencia entre estos dos fragmentos?

A:

IEnumerable<string> items = ...

Parallel.ForEach(items, item => {
   ...
});

B:

IEnumerable<string> items = ...

foreach (var item in items.AsParallel())
{
   ...
}

¿Hay diferentes consecuencias del uso de uno sobre el otro? (Se supone que todo lo que estoy haciendo en los cuerpos corchetes de ambos ejemplos es segura hilo.)

¿Fue útil?

Solución

Lo hacen algo bastante diferente.

La primera de ellas lleva el delegado anónimo, y se ejecuta múltiples hilos en este código en paralelo para todos los elementos diferentes.

El segundo no muy útil en este escenario. En pocas palabras, se pretende hacer una consulta en varios subprocesos, y combinar el resultado, y darle de nuevo para el subproceso de llamada. Por lo que el código en las estancias instrucción foreach siempre en el hilo de interfaz de usuario.

Sólo tiene sentido si se hace algo caro en la consulta LINQ a la derecha de la llamada AsParallel(), como:

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

Otros consejos

La diferencia es, B no es paralela. Lo único que hace es AsParallel() que se envuelve alrededor de un IEnumerable, por lo que cuando se utiliza métodos de LINQ, se utilizan sus variantes paralelas. GetEnumerator() de la envoltura (que se utiliza detrás de las escenas en el foreach) incluso devuelve el resultado de GetEnumerator() de la colección original.

Por cierto, si desea buscar en los métodos de reflector, AsParallel() está en la clase System.Linq.ParallelEnumerable en el System.Core montaje. Parallel.ForEach() está en el mscorlib montaje (espacio de nombres System.Threading.Tasks).

El segundo método no será paralela a la forma correcta de utilizar AsParallel () en su ejemplo sería

IEnumerable<string> items = ...

items.AsParallel().ForAll(item =>
{
    //Do parallel stuff here
});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top