C#并行开发中的任务并行(一)

.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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值