.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、我们还要考虑使用并行模式带来的效率提升是否客观,毕竟线程会产生多余的消耗。