web-dev-qa-db-ja.com

どうすればこの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で書き換えるにはどうすればよいですか?

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

Foreachループ:

  • 繰り返しは順番に行われます
  • foreachループは単一のスレッドから実行されます。
  • foreachループは.NETのすべてのフレームワークで定義されています
  • 遅いプロセスは、順次実行されるので、遅く実行することができます。
    • プロセス2は1が完了するまで開始できません。プロセス3は、2と1が完了するまで開始できません...
  • スレッド化のオーバーヘッドがないため、クイックプロセスの実行は高速になります

Parallel.ForEach:

  • 実行は並行して行われます。
  • Parallel.ForEachは複数のスレッドを使用します。
  • Parallel.ForEachは.Net 4.0以上のフレームワークで定義されています。
  • 遅いプロセスの実行は、より速く実行できます。平行
    • プロセス1、2、&3は同時に実行できます(下記の例の再利用スレッドを参照)
  • 追加のスレッドオーバーヘッドのため、クイックプロセスの実行は遅くなる可能性があります。

次の例は、従来のforeachループと従来の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
255
Jignesh.Raj
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に関するシリーズを書きました。

43
Reed Copsey

大きなファイルの場合は、次のコードを使用します(あなたはメモリをあまり必要としません)。

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

これらの行は私のために働いた。

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