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

发表于:2011-11-30 09:39

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

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

  建议82:Parallel简化但不等同于Task默认行为

  建议81说到了Parallel的使用方法,不知道大家是否注意到文中使用的字眼:在同步状态下简化了Task的使用。也就是说,在运行Parallel中的For、ForEach方法时,调用者线程(在示例中就是主线程)是被阻滞的。Parallel虽然将任务交给Task去处理,即交给CLR线程池去处理,不过调用者会一直等到线程池中的相关工作全部完成。表示并行的静态类Parallel甚至只提供了Invoke方法,而没有同时提供一个BeginInvoke方法,这也从一定程度上说明了这个问题。

  在使用Task时,我们最常使用的是Start方法(Task也提供了RunSynchronously),它不会阻滞调用者线程。如下所示:

  • static void Main()  
  • {  
  •     Task t = new Task(() => 
  •         {  
  •             while (true)  
  •             {  
  •             }  
  •         });  
  •     t.Start();  
  •     Console.WriteLine("主线程即将结束");  
  •     Console.ReadKey();  
  • }
  •   输出为:

    主线程即将结束

      使用Parallel执行相近的功能,主线程被阻滞:

  • static void Main()  
  • {  
  •   //在这里也可以使用Invoke方法  
  •     Parallel.For(0, 1, (i) => 
  •         {  
  •             while (true)  
  •             {  
  •             }  
  •         });  
  •     Console.WriteLine("主线程即将结束");  
  •     Console.ReadKey();  
  • }
  •   如果执行这段代码,永远不会有输出。

      并行编程,意味着运行时在后台将任务分配到尽量多的CPU上,虽然它在后台使用Task进行管理,但这并不意味着它等同于异步。

    相关链接:

    连载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     连载81

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

    关注51Testing

    联系我们

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

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

    沪ICP备05003035号

    沪公网安备 31010102002173号