改善C#程序的建议10:使用Parallel简化Task的使用

在命名空间System.Threading.Tasks下,有一个静态类Parallel简化了在同步状态下的Task的操作。Parallel主要提供了3个有用的方法:For、ForEach、Invoke。
For方法,主要用于处理针对数组元素的并行操作,如下:
static void Main(string[] args) { int[] nums = new int[] { 1, 2, 3, 4 }; Parallel.For(0, nums.Length, (i) => { Console.WriteLine("针对数组索引{0}对应的那个元素{1}的一些工作代码……",i, nums[i]); }); Console.ReadKey(); }
输出为:
针对数组索引0对应的那个元素1的一些工作代码…… 针对数组索引2对应的那个元素3的一些工作代码…… 针对数组索引1对应的那个元素2的一些工作代码…… 针对数组索引3对应的那个元素4的一些工作代码……
可以看到,工作代码并不按照数组的索引次序进行遍历。显而易见,这是因为我们的遍历是并发的,不是顺序的。所以这里也可以引出一个小建议:如果我们的输出必须是同步的或者说必须是顺序输出的,则不应使用Parallel的方式。
Foreach方法,主要用于处理泛型集合元素的并行操作,如下:
static void Main(string[] args) { List nums = new List { 1, 2, 3, 4 }; Parallel.ForEach(nums, (item) => { Console.WriteLine("针对集合元素{0}的一些工作代码……", item); }); Console.ReadKey(); }
输出为:
针对集合元素1的一些工作代码…… 针对集合元素4的一些工作代码…… 针对集合元素3的一些工作代码…… 针对集合元素2的一些工作代码……
使用For和Foreach方法,Parallel类型自动为我们分配Task完成针对元素的一些工作。当然我们也可以直接使用Task,但是上面的这种形式,在语法上看上去更简洁了。
Parallel的Invoke方法,则为我们简化了启动一组并发操作,它隐式启动的就是Task。该方法接受Params Action[]参数,如下:
static void Main(string[] args) { Parallel.Invoke(() => { Console.WriteLine("任务1……"); }, () => { Console.WriteLine("任务2……"); }, () => { Console.WriteLine("任务3……"); }); Console.ReadKey(); }
输出为:
任务2…… 任务3…… 任务1……
同样,由于所有的任务都是并发的,所以它不保证先后次序。
之前话题:

改善C#程序的建议9:使用Task代替ThreadPool和Thread
改善C#程序的建议8:避免锁定不恰当的同步对象
改善C#程序的建议7:正确停止线程
改善C#程序的建议6:在线程同步中使用信号量
改善C#程序的建议5:引用类型赋值为null与加速垃圾回收
改善C#程序的建议4:C#中标准Dispose模式的实现
改善C#程序的建议3:在C#中选择正确的集合进行编码
改善C#程序的建议2:C#中dynamic的正确用法
改善C#程序的建议1:非用ICloneable不可的理由

Tags: 

延伸阅读

最新评论

发表评论