Foreach loop:
- Iteracje następują kolejno, jeden po drugim
- pętla foreach jest uruchamiana z jednego wątku.
- Pętla foreach jest zdefiniowana w każdym systemie .NET
- Wykonanie powolnych procesów może być wolniejsze , a oni uruchomić seryjnie
- Proces 2 nie może rozpocząć się, dopóki nie zostanie ukończony 1. Proces 3 nie może się rozpocząć, dopóki nie zostaną wykonane 2 i 1 ...
- Wykonywanie szybkich procesów może być szybsze , ponieważ nie ma narzutu związanego z gwintowaniem
Parallel.ForEach:
- Wykonanie odbywa się równolegle.
- Parallel.ForEach używa wielu wątków.
- Parallel.ForEach jest zdefiniowany w frameworku .Net 4.0 i nowszych.
- Wykonywanie wolnych procesów może być szybsze , ponieważ można je uruchamiać równolegle
- Procesy 1, 2 i 3 mogą działać jednocześnie (patrz ponownie wykorzystane wątki w przykładzie poniżej)
- Realizacja szybkich procesów może być wolniejsza z powodu dodatkowego narzutu na gwintowanie
Poniższy przykład wyraźnie pokazuje różnicę między tradycyjną pętlą foreach a
Przykład 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();
}
}
}
Wynik
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
Za pomocą przykładu 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