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
});