Quando usar um loop Parallel.ForEach em vez de um foreach regular?

Estou um pouco confuso sobre Parallel.ForEach .
O que é Parallel.ForEach e o que isso faz exatamente?
Por favor, não faça referência a nenhum link do MSDN.

Aqui está um exemplo simples:

 string[] lines = File.ReadAllLines(txtProxyListPath.Text); List list_lines = new List(lines); foreach (string line in list_lines) { //My Stuff } 

Como posso rewrite este exemplo com Parallel.ForEach ?

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

    Foreach loop:

    • As iterações ocorrem sequencialmente, uma por uma
    • loop foreach é executado a partir de um único thread.
    • loop foreach é definido em todas as estruturas do .NET
    • Execução de processos lentos pode ser mais lenta , como eles são executados em série
      • O processo 2 não pode começar até que 1 seja feito. O processo 3 não pode começar até que 2 e 1 estejam prontos …
    • A execução de processos rápidos pode ser mais rápida , pois não há sobrecarga de threading

    Paralelo.Para cada:

    • A execução ocorre de maneira paralela.
    • Parallel.ForEach usa vários segmentos.
    • Parallel.ForEach é definido em frameworks .Net 4.0 e posteriores.
    • A execução de processos lentos pode ser mais rápida , pois eles podem ser executados em paralelo
      • Os processos 1, 2 e 3 podem ser executados simultaneamente (consulte os tópicos reutilizados no exemplo abaixo)
    • A execução de processos rápidos pode ser mais lenta , devido à sobrecarga de encadeamento adicional

    O exemplo a seguir demonstra claramente a diferença entre o loop foreach tradicional e

    Parallel.ForEach () Exemplo

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

    Saída

     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 exemplo

     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 list_lines = new List(lines); Parallel.ForEach(lines, line => { //My Stuff }); 

    Isso fará com que as linhas sejam analisadas em paralelo, dentro do loop. Se você quiser uma introdução mais detalhada, menos “orientada à referência” para a class Parallel, eu escrevi uma série na TPL que inclui uma seção em Parallel.ForEach .

    Para arquivo grande use o seguinte código (você está com menos fome de memory)

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