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");
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");
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
Parallel
类和使用PLINQ之间的区别。 - Reed Copseyforeach
循环一样。不同之处在于并行版本可以同时执行许多“操作”。在大多数情况下(取决于运行代码的计算机、其繁忙程度和其他因素),它将更快,这是最重要的优点。请注意,当您并行处理时,无法知道处理项目的顺序。使用普通(串行)foreach
循环,您可以保证会先处理lines[0]
,然后是lines[1]
等。 - Jeppe Stig Nielsen