¿Cómo puedo convertir este código foreach a Parallel.ForEach?

Resuelto SilverLight asked hace 12 años • 6 respuestas

Estoy un poco confundido acerca de Parallel.ForEach.
¿Qué es Parallel.ForEachy para qué sirve exactamente?
No haga referencia a ningún enlace de MSDN.

He aquí un ejemplo sencillo:

string[] lines = File.ReadAllLines(txtProxyListPath.Text);
List<string> list_lines = new List<string>(lines);

foreach (string line in list_lines)
{
    //My Stuff
}

¿ Cómo puedo reescribir este ejemplo Parallel.ForEach?

SilverLight avatar Sep 04 '12 00:09 SilverLight
Aceptado

Bucle para cada uno:

  • Las iteraciones se llevan a cabo secuencialmente, una por una.
  • El bucle foreach se ejecuta desde un único hilo.
  • El bucle foreach está definido en todos los marcos de .NET.
  • La ejecución de procesos lentos puede ser más lenta , ya que se ejecutan en serie.
    • El proceso 2 no puede comenzar hasta que finalice el 1. El proceso 3 no puede comenzar hasta que terminen los 2 y 1...
  • La ejecución de procesos rápidos puede ser más rápida , ya que no hay sobrecarga de subprocesos.

Paralelo.ParaCada:

  • La ejecución se realiza de forma paralela.
  • Parallel.ForEach utiliza múltiples subprocesos.
  • Parallel.ForEach se define en .Net 4.0 y marcos superiores.
  • La ejecución de procesos lentos puede ser más rápida , ya que se pueden ejecutar en paralelo
    • Los procesos 1, 2 y 3 pueden ejecutarse simultáneamente (consulte los subprocesos reutilizados en el ejemplo a continuación)
  • La ejecución de procesos rápidos puede ser más lenta debido a la sobrecarga adicional de subprocesos

El siguiente ejemplo demuestra claramente la diferencia entre el bucle foreach tradicional y

Ejemplo de Parallel.ForEach()

using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
namespace ParallelForEachExample
{
    class Program
    {
        static void Main()
        {
            string[] colors = {
                                  "1. Red",
                                  "2. Green",
                                  "3. Blue",
                                  "4. Yellow",
                                  "5. White",
                                  "6. Black",
                                  "7. Violet",
                                  "8. Brown",
                                  "9. Orange",
                                  "10. Pink"
                              };
            Console.WriteLine("Traditional foreach loop\n");
            //start the stopwatch for "for" loop
            var sw = Stopwatch.StartNew();
            foreach (string color in colors)
            {
                Console.WriteLine("{0}, Thread Id= {1}", color, Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(10);
            }
            Console.WriteLine("foreach loop execution time = {0} seconds\n", sw.Elapsed.TotalSeconds);
            Console.WriteLine("Using Parallel.ForEach");
            //start the stopwatch for "Parallel.ForEach"
             sw = Stopwatch.StartNew();
            Parallel.ForEach(colors, color =>
            {
                Console.WriteLine("{0}, Thread Id= {1}", color, Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(10);
            }
            );
            Console.WriteLine("Parallel.ForEach() execution time = {0} seconds", sw.Elapsed.TotalSeconds);
            Console.Read();
        }
    }
}

Producción

Traditional foreach loop
1. Red, Thread Id= 10
2. Green, Thread Id= 10
3. Blue, Thread Id= 10
4. Yellow, Thread Id= 10
5. White, Thread Id= 10
6. Black, Thread Id= 10
7. Violet, Thread Id= 10
8. Brown, Thread Id= 10
9. Orange, Thread Id= 10
10. Pink, Thread Id= 10
foreach loop execution time = 0.1054376 seconds

Usando Parallel.ForEach ejemplo

1. Red, Thread Id= 10
3. Blue, Thread Id= 11
4. Yellow, Thread Id= 11
2. Green, Thread Id= 10
5. White, Thread Id= 12
7. Violet, Thread Id= 14
9. Orange, Thread Id= 13
6. Black, Thread Id= 11
8. Brown, Thread Id= 10
10. Pink, Thread Id= 12
Parallel.ForEach() execution time = 0.055976 seconds
Jignesh.Raj avatar Jul 05 '2013 09:07 Jignesh.Raj
string[] lines = File.ReadAllLines(txtProxyListPath.Text);
List<string> list_lines = new List<string>(lines);
Parallel.ForEach(list_lines, line =>
{
    //Your stuff
});
L.B avatar Sep 03 '2012 17:09 L.B
string[] lines = File.ReadAllLines(txtProxyListPath.Text);

// No need for the list
// List<string> list_lines = new List<string>(lines); 

Parallel.ForEach(lines, line =>
{
    //My Stuff
});

Esto hará que las líneas se analicen en paralelo, dentro del bucle. Si desea una introducción más detallada y menos "orientada a la referencia" a la clase Parallel, escribí una serie sobre TPL que incluye una sección sobre Parallel.ForEach .

Reed Copsey avatar Sep 03 '2012 17:09 Reed Copsey