Как я могу преобразовать этот код foreach в Parallel.ForEach?

Я немного запутался в Parallel.ForEach.
Что такое Parallel.ForEach и что он делает?
Не указывайте ссылку на MSDN.

Вот простой пример:

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

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

Как я могу переписать этот пример с помощью Parallel.ForEach?

Ответ 1

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

Ответ 2

Цикл Foreach:

  • Итерации происходят последовательно, один за другим
  • цикл foreach запускается из одного потока.
  • цикл foreach определен в любой среде .NET.
  • Выполнение медленных процессов может быть медленнее, поскольку они запускаются серийно
    • Процесс 2 не может начаться до тех пор, пока не будет выполнено 1. Процесс 3 не может начинаться до тех пор, пока не будут выполнены 2 и 1...
  • Выполнение быстрых процессов может быть более быстрым, так как нет накладных расходов

Parallel.ForEach:

  • Выполнение выполняется параллельно.
  • Parallel.ForEach использует несколько потоков.
  • Parallel.ForEach определяется в .Net 4.0 и выше.
  • Выполнение медленных процессов может быть быстрее, поскольку они могут выполняться параллельно
    • Процессы 1, 2 и 3 могут выполняться одновременно (см. повторно используемые потоки в примере ниже)
  • Выполнение быстрых процессов может быть медленнее из-за дополнительных накладных расходов

В следующем примере наглядно демонстрируется разница между традиционным циклом foreach и

Параллельный .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();
        }
    }
}

Выход

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

Использование примера 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

Ответ 3

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

Это приведет к параллельному анализу строк в цикле. Если вы хотите получить более подробное, менее ориентированное ориентирование на класс Parallel, я написал серию на TPL, которая включает раздел на Parallel.ForEach.

Ответ 4

Для большого файла используйте следующий код (вы менее голодны)

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