-->

我如何转换这的foreach代码Parallel.ForEach?(How can I conver

2019-06-18 00:01发布

我有点糊涂约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

Answer 1:

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


Answer 2:

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


Answer 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部分 。



Answer 4:

对于大文件,使用下面的代码(你是内存少饿)

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


文章来源: How can I convert this foreach code to Parallel.ForEach?