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

 



 

0 0
原创粉丝点击