c# - maxdegreeofparallelism - parallel foreach list add




Wann sollte eine Parallel.ForEach-Schleife anstelle einer regulären foreach verwendet werden? (3)

Für große Dateien verwenden Sie den folgenden Code (Sie sind weniger Speicher hungrig)

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

https://code.i-harness.com

Ich bin etwas verwirrt über Parallel.ForEach .
Was ist Parallel.ForEach und was genau macht es?
Bitte verweisen Sie nicht auf einen MSDN-Link.

Hier ist ein einfaches Beispiel:

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

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

Wie kann ich dieses Beispiel mit Parallel.ForEach umschreiben?


Foreach-Schleife:

  • Iterationen finden nacheinander statt
  • foreach-Schleife wird von einem einzelnen Thread ausgeführt.
  • foreach-Schleife ist in jedem Framework von .NET definiert
  • Die Ausführung langsamer Prozesse kann langsamer sein , da sie seriell ausgeführt werden
    • Prozess 2 kann erst beginnen, wenn 1 erledigt ist. Prozess 3 kann erst beginnen, wenn 2 & 1 fertig sind ...
  • Die Ausführung schneller Prozesse kann schneller sein , da kein Thread-Overhead vorhanden ist

Parallel.Für jedes:

  • Die Ausführung erfolgt parallel.
  • Parallel.ForEach verwendet mehrere Threads.
  • Parallel.ForEach ist in .NET 4.0 und höher definiert.
  • Die Ausführung langsamer Prozesse kann schneller sein , da sie parallel ausgeführt werden können
    • Die Prozesse 1, 2 und 3 können gleichzeitig ausgeführt werden (siehe weiter unten im Beispiel verwendete Threads)
  • Die Ausführung schneller Prozesse kann wegen des zusätzlichen Threading-Aufwands langsamer sein

Das folgende Beispiel zeigt deutlich den Unterschied zwischen traditioneller foreach - Schleife und

Parallel.ForEach () Beispiel

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

Ausgabe

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

Verwenden von Parallel.ForEach Beispiel

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




parallel.foreach