197

私は少し混乱してい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ですか?

4

6 に答える 6

299

Foreachループ:

  • 反復は1つずつ順番に行われます
  • foreachループは単一のスレッドから実行されます。
  • foreachループは、.NETのすべてのフレームワークで定義されています
  • 遅いプロセスの実行は、連続して実行されるため、 遅くなる可能性があります
    • プロセス2は、1が完了するまで開始できません。プロセス3は、2と1が完了するまで開始できません...
  • スレッドのオーバーヘッドがないため、迅速なプロセスの実行を高速化できます

Parallel.ForEach:

  • 実行は並行して行われます。
  • Parallel.ForEachは複数のスレッドを使用します。
  • Parallel.ForEachは、.Net4.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
于 2013-07-05T09:54:51.200 に答える
136
string[] lines = File.ReadAllLines(txtProxyListPath.Text);
List<string> list_lines = new List<string>(lines);
Parallel.ForEach(list_lines, line =>
{
    //Your stuff
});
于 2012-09-03T17:18:11.257 に答える
44
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に関するシリーズを作成しました。

于 2012-09-03T17:17:53.113 に答える
11

大きなファイルの場合は、次のコードを使用します(メモリの消費量が少なくなります)

Parallel.ForEach(File.ReadLines(txtProxyListPath.Text), line => {
    //Your stuff
});
于 2016-04-06T15:09:20.143 に答える
4

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

string[] lines = File.ReadAllLines(txtProxyListPath.Text);
var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 10 };
Parallel.ForEach(lines , options, (item) =>
{
 //My Stuff
});
于 2019-08-01T08:07:59.627 に答える
1

並列オプションについて追加したいと思います。あなたがそれについて言及しなかった場合、デフォルトではすべてのRAMがこれに利用され、本番環境で問題が発生する可能性があります。したがって、コードにも最大の並列処理を追加することをお勧めします。

Parallel.ForEach(list_lines, new ParallelOptions { MaxDegreeOfParallelism = 2 }, line =>
{
    
});
于 2021-06-03T08:09:08.877 に答える