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

 



 

你可能感兴趣的:(并行编程)