改善C#程序的157个建议(连载81)

发表于:2011-11-29 10:13

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:陆敏技    来源:51Testing软件测试网采编

  建议81:使用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<int> nums = new List<int> { 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……
  •   同样,由于所有的任务都是并行的,所以它不保证先后次序。

    相关链接:

    连载1       连载2       连载3        连载4        连载5       连载6       连载7       连载8       连载9

    连载10     连载11     连载12     连载13     连载14     连载15     连载71     连载72     连载73     

    连载74     连载75     连载76     连载77    连载78     连载79      连载80

    《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号