C# 4.0 并行计算部分

一、简单使用

        首先我们初始化一个List用于循环,这里我们循环10次。(后面的代码都会按这个标准进行循环)

Code
Program .Data = new List <int >(); for (int i = 0; i < 10; i++) { Data.Add(i); }  

        下面我们定义4个方法,分别为for,foreach,并行For,并行ForEach。并测试他们的运行时长。

Code
/// <summary> /// 是否显示执行过程 /// </summary> public bool ShowProcessExecution = false ; /// <summary> /// 这是普通循环for /// </summary> private void Demo1() { List <int > data = Program .Data; DateTime dt1 = DateTime .Now; for (int i = 0; i < data.Count; i++) { Thread .Sleep(500); if (ShowProcessExecution) Console .WriteLine(data[i]); } DateTime dt2 = DateTime .Now; Console .WriteLine("普通循环For运行时长:{0}毫秒。" , (dt2 - dt1).TotalMilliseconds); } /// <summary> /// 这是普通循环foreach /// </summary> private void Demo2() { List <int > data = Program .Data; DateTime dt1 = DateTime .Now; foreach (var i in data) { Thread .Sleep(500); if (ShowProcessExecution) Console .WriteLine(i); } DateTime dt2 = DateTime .Now; Console .WriteLine("普通循环For运行时长:{0}毫秒。" , (dt2 - dt1).TotalMilliseconds); } /// <summary> /// 这是并行计算For /// </summary> private void Demo3() { List <int > data = Program .Data; DateTime dt1 = DateTime .Now; Parallel .For(0, data.Count, (i) => { Thread .Sleep(500); if (ShowProcessExecution) Console .WriteLine(data[i]); }); DateTime dt2 = DateTime .Now; Console .WriteLine("并行运算For运行时长:{0}毫秒。" , (dt2 - dt1).TotalMilliseconds); } /// <summary> /// 这是并行计算ForEach /// </summary> private void Demo4() { List <int > data = Program .Data; DateTime dt1 = DateTime .Now; Parallel .ForEach(data, (i) => { Thread .Sleep(500); if (ShowProcessExecution) Console .WriteLine(i); }); DateTime dt2 = DateTime .Now; Console .WriteLine("并行运算ForEach运行时长:{0}毫秒。" , (dt2 - dt1).TotalMilliseconds); } 

下面是运行结果:

image

这里我们可以看出并行循环在执行效率上的优势了。

结论1:在对一个数组内的每一个项做单独处理时,完全可以选择并行循环的方式来提升执行效率。

原理1:并行计算的线程开启是缓步开启的,线程数量1,2,4,8缓步提升。(不详,PLinq最多64个线程,可能这也是64)

 


 

二、 并行循环的中断和跳出

        当在进行循环时,偶尔会需要中断循环或跳出循环。下面是两种跳出循环的方法Stop和Break,LoopState是循环状态的参数。

Code

/// <summary> /// 中断Stop /// </summary> private void Demo5() { List <int > data = Program .Data; Parallel .For(0, data.Count, (i, LoopState) => { if (data[i] > 5) LoopState.Stop(); Thread .Sleep(500); Console .WriteLine(data[i]); }); Console .WriteLine("Stop执行结束。" ); } /// <summary> /// 中断Break /// </summary> private void Demo6() { List <int > data = Program .Data; Parallel .ForEach(data, (i, LoopState) => { if (i > 5) LoopState.Break(); Thread .Sleep(500); Console .WriteLine(i); }); Console .WriteLine("Break执行结束。" ); }

 

执行结果如下:

C# 4.0 并行计算部分_第1张图片

结论2:使用Stop会立即停止循环,使用Break会执行完毕所有符合条件的项。

 

你可能感兴趣的:(thread,list,C#,测试,parallel)