C#并行开发中的任务并行(一)
来源:互联网 发布:建一个淘宝白菜群佣金 编辑:程序博客网 时间:2024/05/02 06:44
.Net Framework4中引入了新的类库,也就是Task Parallel Libary(任务并行库,PTL),相较于之前的多线程并发的模式,TPL是以任务为基础的一种轻量级并行模式。
通过任务并行库,可以处理数据并行、任务并行等操作。现在,我们逐一介绍TPL中的类库。
1、System.Threading.Tasks.Parallel类
使用Parallel类之前需要引入System.Threading.Tasks的命名空间。
Parallel类提供了3个静态方法:
1)Parallel.For:为固定数目的独立的For循环迭代提供了负载均衡的潜在的并行执行。换言之,Parallel.For可以以一种并行的方式对循环体进行遍历。如下代码:
static void Main(string[] args) { List<string> lists = new List<string>(); lists.Add("ID1"); lists.Add("ID2"); lists.Add("ID3"); lists.Add("ID4"); lists.Add("ID5"); Console.WriteLine("串行For循环执行结果:"); //使用for循环来逐步更新数据库 for (int i = 0; i < lists.Count; i++) { string sql = string.Format("update table1 set IsExit =1 where Id='{0}'",lists[i]); Execute(sql); } //注意,上面循环中的更新语句只取决于主键Id,和lists的顺序无关 //所以这时候,我们可以考虑TPL库提供的并行循环 Console.WriteLine("并行For循环执行结果:"); //使用并行循环处理数据更新 System.Threading.Tasks.Parallel.For(0, lists.Count, (int i) => { string sql = string.Format("update table1 set IsExit =1 where Id='{0}'", lists[i]); Execute(sql); }); } private static void Execute(string sql) { Console.WriteLine("更新语句:"+sql); }
执行结果如下:
串行For循环执行结果:更新语句:update table1 set IsExit =1 where Id='ID1'更新语句:update table1 set IsExit =1 where Id='ID2'更新语句:update table1 set IsExit =1 where Id='ID3'更新语句:update table1 set IsExit =1 where Id='ID4'更新语句:update table1 set IsExit =1 where Id='ID5'并行For循环执行结果:更新语句:update table1 set IsExit =1 where Id='ID1'更新语句:update table1 set IsExit =1 where Id='ID3'更新语句:update table1 set IsExit =1 where Id='ID2'更新语句:update table1 set IsExit =1 where Id='ID5'更新语句:update table1 set IsExit =1 where Id='ID4'
相比较而言,如果数据量比较大的情况下,并行For循环执行的效率无疑高于前者。
2)Parallel.ForEach:同Parallel.For。
3)Parallel.Invoke:将多种方法并行运行。例如:假设你有以下4个执行格式转换的独立方法,而且能够保证安全并发的运行它们,则可以使用Invoke。
.ConverEllipses
.ConvertRectangles
.ConvertLines
.ConvertText
并行代码:
Parallel.Invoke(ConverEllipses,ConvertRectangles,ConvertLines,ConvertText);
同时,使用以上的方法进行并行运算,不得不考虑以下的情况:
1、执行时没有特定的顺序,也就是说,我们无法指定执行的顺序。所以,如果想要有序的遍历一个循环体,此种方式不可取。
2、由于无法按照我们想要的方式执行,所以也给程序的调式增加了难度。
3、我们还要考虑使用并行模式带来的效率提升是否客观,毕竟线程会产生多余的消耗。
- C#并行开发中的任务并行(一)
- C#并行编程--并行任务
- C#命令式任务并行开发
- VS2010中的任务并行
- C# 4.0的并行任务
- C# 4.0中的 并行运算
- 浅谈并行编程中的任务分解模式
- 浅谈并行编程中的任务分解模式
- 浅谈并行编程中的任务分解模式
- 浅谈并行编程中的任务分解模式
- 并行开发
- 并行开发
- C++并行开发Pthread之线程(一)
- java 大数据学习笔记(一)并行开发
- OpenMP并行程序设计(一)
- OpenMP并行程序设计(一)
- OpenMP并行程序设计(一)
- OpenMP并行程序设计(一)
- 【HDU】1827 Summer Holiday 强连通缩点
- 编译原理 (预处理>编译>汇编>链接)
- HDU 1556 Color the ball
- Sicily.1264. Atomic Car Race
- Candy
- C#并行开发中的任务并行(一)
- Floyd 算法
- 算法导论——lec 06 堆排序
- import com.google.android.maps.MapView报错
- 快速排序时间复杂度数学证明
- 计数排序、基数排序与桶排序
- android performClick使用
- 网址记录
- Android中的PopupWindow详解