try parallel for catch c# multithreading .net-4.0 parallel.foreach

c# - catch - parallel for aggregateexception



¿Cuándo usar un bucle Parallel.ForEach en lugar de un foreach regular? (4)

Estoy un poco confundido sobre Parallel.ForEach .
¿Qué es Parallel.ForEach y qué hace exactamente?
Por favor, no haga referencia a ningún enlace de MSDN.

Aquí hay un ejemplo simple:

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 con Parallel.ForEach ?


Para archivos grandes, use el siguiente código (tiene menos memoria)

Parallel.ForEach(File.ReadLines(txtProxyListPath.Text), line => { //Your stuff });


Bucle Foreach:

  • Las iteraciones se llevan a cabo secuencialmente, una a una
  • foreach loop se ejecuta desde un solo subproceso.
  • foreach loop se define en cada framework 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 1 esté listo. El proceso 3 no puede comenzar hasta que se completen 2 y 1 ...
  • La ejecución de procesos rápidos puede ser más rápida , ya que no hay sobrecarga de enhebrado

Parallel.ForEach:

  • La ejecución se lleva a cabo de forma paralela.
  • Parallel.ForEach usa múltiples hilos.
  • Parallel.ForEach se define en .NET 4.0 y marcos anteriores.
  • 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 (ver los hilos reutilizados en el ejemplo a continuación)
  • La ejecución de procesos rápidos puede ser más lenta , debido a sobrecarga adicional de enhebrado

El siguiente ejemplo demuestra claramente la diferencia entre el ciclo 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(); } } }

Salida

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 el ejemplo de Parallel.ForEach

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


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 sean analizadas en paralelo, dentro del ciclo. Si desea una introducción más detallada y menos "orientada a la referencia" a la clase Parallel, escribí una serie sobre el TPL que incluye una sección en Parallel.ForEach .


string[] lines = File.ReadAllLines(txtProxyListPath.Text); List<string> list_lines = new List<string>(lines); Parallel.ForEach(list_lines, line => { //Your stuff });