Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

วิธีจำกัด Parallel.ForEach ใน C#


Parallel Foreach

Parallel.ForEach loop ใน C# ทำงานบนหลายเธรดและการประมวลผลเกิดขึ้นแบบขนาน Parallel.ForEach loop ไม่ใช่คุณสมบัติพื้นฐานของ C# และพร้อมใช้งานตั้งแต่ C# 4.0 ขึ้นไป เพื่อใช้ Parallel.ForEach loop เราต้อง import namespace System.Threading.Tasks ใน using directive

Foreach

Foreach loop ใน C# ทำงานบนเธรดเดียวและการประมวลผลเกิดขึ้นแบบลำดับชั้นทีละอัน Foreach loop เป็นคุณสมบัติพื้นฐานของ C# และพร้อมใช้งานตั้งแต่ C# 1.0 การดำเนินการของมันช้ากว่า Parallel.Foreach ในส่วนใหญ่ของกรณี

ตัวอย่าง 1

static void Main(string[] args){    List<string> alphabets = new List<string>();    alphabets.Add("A");    alphabets.Add("B");    alphabets.Add("C");    alphabets.Add("D");    alphabets.Add("E");    alphabets.Add("F");    alphabets.Add("G");    alphabets.Add("H");    alphabets.Add("I");    alphabets.Add("J");    alphabets.Add("K");    alphabets.Add("L");    alphabets.Add("M");    alphabets.Add("N");    alphabets.Add("O");    alphabets.Add("P");    alphabets.Add("Q");    alphabets.Add("R");    alphabets.Add("S");    alphabets.Add("T");    alphabets.Add("U");    alphabets.Add("V");    alphabets.Add("W");    alphabets.Add("X");    alphabets.Add("Y");    alphabets.Add("Z");    Console.WriteLine("Printing list using foreach loop\n");    var stopWatch = Stopwatch.StartNew();    foreach (string alphabet in alphabets){       Console.WriteLine("alphabet Name: {0}, Thread Id= {1}", alphabet,          Thread.CurrentThread.ManagedThreadId);    }    Console.WriteLine("foreach loop execution time = {0} seconds\n", stopWatch.Elapsed.TotalSeconds);    Console.WriteLine("Printing list using Parallel.ForEach");    stopWatch = Stopwatch.StartNew();    Parallel.ForEach(alphabets, alphabet =>    {       Console.WriteLine("alphabet Name: {0}, Thread Id= {1}", alphabet,       Thread.CurrentThread.ManagedThreadId);    }    );    Console.WriteLine("Parallel.ForEach() execution time = {0} seconds",    stopWatch.Elapsed.TotalSeconds);    Console.Read();    Console.ReadLine(); }

ผลลัพธ์

Printing list using foreach loop

alphabet Name: A, Thread Id= 1 alphabet Name: B, Thread Id= 1 alphabet Name: C, Thread Id= 1 alphabet Name: D, Thread Id= 1 alphabet Name: E, Thread Id= 1 alphabet Name: F, Thread Id= 1 alphabet Name: G, Thread Id= 1 alphabet Name: H, Thread Id= 1 alphabet Name: I, Thread Id= 1 alphabet Name: J, Thread Id= 1 alphabet Name: K, Thread Id= 1 alphabet Name: L, Thread Id= 1 alphabet Name: M, Thread Id= 1 alphabet Name: N, Thread Id= 1 alphabet Name: O, Thread Id= 1 alphabet Name: P, Thread Id= 1 alphabet Name: Q, Thread Id= 1 alphabet Name: R, Thread Id= 1 alphabet Name: S, Thread Id= 1 alphabet Name: T, Thread Id= 1 alphabet Name: U, Thread Id= 1 alphabet Name: V, Thread Id= 1 alphabet Name: W, Thread Id= 1 alphabet Name: X, Thread Id= 1 alphabet Name: Y, Thread Id= 1 alphabet Name: Z, Thread Id= 1 foreach loop execution time = 0.0223421 seconds

Printing list using Parallel.ForEach

alphabet Name: A, Thread Id= 1 alphabet Name: G, Thread Id= 4 alphabet Name: H, Thread Id= 4 alphabet Name: I, Thread Id= 4 alphabet Name: J, Thread Id= 4 alphabet Name: K, Thread Id= 4 alphabet Name: L, Thread Id= 4 alphabet Name: N, Thread Id= 4 alphabet Name: O, Thread Id= 4 alphabet Name: P, Thread Id= 4 alphabet Name: Q, Thread Id= 4 alphabet Name: Y, Thread Id= 6 alphabet Name: Z, Thread Id= 6 alphabet Name: D, Thread Id= 6 alphabet Name: E, Thread Id= 6 alphabet Name: F, Thread Id= 6 alphabet Name: T, Thread Id= 6 alphabet Name: U, Thread Id= 6 alphabet Name: V, Thread Id= 6 alphabet Name: R, Thread Id= 4 alphabet Name: M, Thread Id= 5 alphabet Name: S, Thread Id= 7 alphabet Name: B, Thread Id= 1 alphabet Name: C, Thread Id= 1 alphabet Name: W, Thread Id= 6 alphabet Name: X, Thread Id= 6 Parallel.ForEach() execution time = 0.0559777 seconds

ตัวอย่าง 2

จำกัด Paralleleism ใน parallel.foreach

static class Program{    static void Main(string[] args){       List<string> alphabets = new List<string>();       alphabets.Add("A");       alphabets.Add("B");       alphabets.Add("C");       alphabets.Add("D");       alphabets.Add("E");       alphabets.Add("F");       alphabets.Add("G");       alphabets.Add("H");       alphabets.Add("I");       alphabets.Add("J");       alphabets.Add("K");       alphabets.Add("L");       alphabets.Add("M");       alphabets.Add("N");       alphabets.Add("O");       alphabets.Add("P");       alphabets.Add("Q");       alphabets.Add("R");       alphabets.Add("S");       alphabets.Add("T");       alphabets.Add("U");       alphabets.Add("V");       alphabets.Add("W");       alphabets.Add("X");       alphabets.Add("Y");       alphabets.Add("Z");       Parallel.ForEach(       alphabets,       new ParallelOptions { MaxDegreeOfParallelism = 2 },       alphabet => { Console.WriteLine("alphabet Name: {0}, Thread Id= {1}", alphabet,       Thread.CurrentThread.ManagedThreadId); }    );    } }

ผลลัพธ์

alphabet Name: N, Thread Id= 4 alphabet Name: O, Thread Id= 4 alphabet Name: P, Thread Id= 4 alphabet Name: A, Thread Id= 1 alphabet Name: B, Thread Id= 1 alphabet Name: C, Thread Id= 1 alphabet Name: Q, Thread Id= 4 alphabet Name: R, Thread Id= 4 alphabet Name: S, Thread Id= 4 alphabet Name: T, Thread Id= 4 alphabet Name: U, Thread Id= 4 alphabet Name: V, Thread Id= 4 alphabet Name: W, Thread Id= 4 alphabet Name: X, Thread Id= 4 alphabet Name: Y, Thread Id= 4 alphabet Name: Z, Thread Id= 4 alphabet Name: H, Thread Id= 4 alphabet Name: I, Thread Id= 4 alphabet Name: J, Thread Id= 4 alphabet Name: K, Thread Id= 4 alphabet Name: D, Thread Id= 1 alphabet Name: L, Thread Id= 4 alphabet Name: E, Thread Id= 1 alphabet Name: F, Thread Id= 1 alphabet Name: G, Thread Id= 1 alphabet Name: M, Thread Id= 4