C#并行循环的使用
c#中提供并行循环的类为parallel类,该类的位于system.Threading.Tasks命名空间下,对应的文件为System.Threading.Tasks.Parallel.dll
parallel中提供并行操作的方法有
- parallel.invoke():尽可能并行执行所请求的每个操作。
- parallel.for():提供并行执行的for循环
- parallel.foreach()提供并行化的foreach操作
以上三个方法均具有多个重载
我们用下面的代码来测试并行invoke方法和for循环的效果
代码中使用的stopwatch类是系统系统的用来精确测量代码运行耗时的类型。可以利用该对象测量程序运行的耗时。
class Program
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Stopwatch Sw = new Stopwatch(); 6 Action[] act = new Action[2]; 7 Sw.Start(); 8 Parallel.Invoke(seeme, seeyou); 9 Sw.Stop(); 10 Console.WriteLine("并行执行seeme和seeyou所用的时间为{0}ms", Sw.ElapsedMilliseconds); 11 Sw.Restart(); 12 for (int i = 0; i < 10; i++) 13 { 14 Console.WriteLine("这是第{0}次循环", i); 15 Thread.Sleep(1000); 16 17 } 18 Sw.Stop(); 19 Console.WriteLine("单循环耗时{0}ms", Sw.ElapsedMilliseconds); 20 Sw.Restart(); 21 Parallel.For(0, 10, (i) => 22 { 23 Console.WriteLine("这是第{0}次循环",i); 24 Thread.Sleep(1000); 25 }); 26 Sw.Stop(); 27 Console.WriteLine("并行循环的耗时:{0}ms", Sw.ElapsedMilliseconds); 28 Sw.Restart(); 29 seeme(); 30 seeyou(); 31 Sw.Stop(); 32 Console.WriteLine("顺序执行seeme和seeyou所用的时间为{0}ms", Sw.ElapsedMilliseconds); 33 Console.ReadKey(); 34 } 35 public static void seeme( ) 36 { 37 Console.WriteLine("我开始了"); 38 Thread.Sleep(2000); 39 Console.WriteLine("我结束了"); 40 } 41 public static void seeyou( ) 42 { 43 Console.WriteLine("你开始了"); 44 Thread.Sleep(3000); 45 Console.WriteLine("你结束了"); 46 } 47 }
代码运行的效果如下:
从上面的代码看出并行循环的的执行是没有顺序的,在需要耗费大量时间的循环操作中,使用并行循环可以显著的节省时间。