[C#] 이 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어떻게 다시 작성할 수 있습니까?



답변

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


답변

Foreach 루프 :

  • 반복은 하나씩 순차적으로 수행됩니다.
  • foreach 루프는 단일 스레드에서 실행됩니다.
  • foreach 루프는 .NET의 모든 프레임 워크에서 정의됩니다.
  • 느리게 실행되는 프로세스는 순차적으로 실행

    되므로 느려질 수 있습니다.

    • 프로세스 2는 1이 완료 될 때까지 시작할 수 없습니다. 프로세스 3은 2 & 1이 완료 될 때까지 시작할 수 없습니다 …
  • 스레딩 오버 헤드가 없으므로 빠른 프로세스 실행이 더 빨라질 수 있습니다.

Parallel.ForEach :

  • 실행은 병렬로 수행됩니다.
  • Parallel.ForEach는 여러 스레드를 사용합니다.
  • Parallel.ForEach는 .Net 4.0 이상 프레임 워크에서 정의됩니다.
  • 의 실행 속도가 느린 프로세스가 될 수 있습니다 빨리 그들이 병렬로 실행할 수있는,
    • 프로세스 1, 2 및 3 동시에 실행될 있습니다 (아래 예에서 재사용 된 스레드 참조).
  • 추가 스레딩 오버 헤드로 인해 빠른 프로세스 실행이 느려질 수 있습니다.

다음 예제는 전통적인 foreach 루프와

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

산출

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


답변

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 클래스에 대한보다 자세하고 “참조 지향적 인”소개를 원한다면 Parallel.ForEach 섹션 을 포함하는 시리즈를 TPL에 작성했습니다 .


답변

큰 파일의 경우 다음 코드를 사용하십시오 (메모리가 부족합니다)

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


답변

이 라인은 나를 위해 일했습니다.

string[] lines = File.ReadAllLines(txtProxyListPath.Text);
var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 10 };
Parallel.ForEach(lines , options, (item) =>
{
 //My Stuff
});


답변