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

发表于:2011-11-28 09:27

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

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

分享:
  • while (true)  
  • {  
  • //ct.ThrowIfCancellationRequested();  
  • if (result == 5)  
  • {  
  •     throw new Exception("error");  
  • }  
  • result++;  
  • Thread.Sleep(1000);  
  • }
  •   模拟异常后的输出为:

    任务开始……

      任务完成,完成时候的状态为:

    IsCanceled=False        IsCompleted=True        IsFaulted=True

      Task还支持任务工厂的概念。任务工厂支持多个任务之间共享相同的状态,如取消类型CancellationTokenSource就是可以被共享的。通过使用任务工厂,可以同时取消一组任务:

  • static void Main(string[] args)  
  • {  
  •     CancellationTokenSource cts = new CancellationTokenSource();  
  •     //等待按任意键取消任务  
  •     TaskFactory taskFactory = new TaskFactory();  
  •     Task[] tasks = new Task[]  
  •         {  
  •             taskFactory.StartNew(() => Add(cts.Token)),  
  •             taskFactory.StartNew(() => Add(cts.Token)),  
  •             taskFactory.StartNew(() => Add(cts.Token))  
  •         };  
  •     //CancellationToken.None指示TasksEnded不能被取消  
  •     taskFactory.ContinueWhenAll(tasks, TasksEnded, CancellationToken.None);  
  •     Console.ReadKey();  
  •     cts.Cancel();  
  •     Console.ReadKey();  
  • }  
  • static void TasksEnded(Task[] tasks)  
  • {  
  •     Console.WriteLine("所有任务已完成!");  
  • }
  •   以上代码的输出为:

  • 任务开始……  
  • 任务开始……  
  • 任务开始……  
  • 所有任务已完成(取消)!
  •   本建议演示了Task(任务)和TaskFactory(任务工厂)的使用方法。Task进一步优化了后台线程池的调度,加快了线程的处理速度。所以在FCL 4.0时代,如果要使用多线程,我们理应更多地使用Task。

      因此,在本书接下来的建议中,如无特别必要,只要涉及多线程内容的,都将一并使用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

    33/3<123
    春暖花开更文季,点击参与还有惊喜礼品~

    关注51Testing

    联系我们

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

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

    沪ICP备05003035号

    沪公网安备 31010102002173号