• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
只是向上走
采菊东篱下,悠然见南山。
博客园    首页    新随笔    联系   管理    订阅  订阅
C#异步编程的实现方式(5)——连续任务

通过任务,可以指定在任务完成后,应开始运行另一个特定任务。任务处理程序或者不带参数或者带一个对象参数,而连续处理程序有一个Task类型的参数。下面先定义两个任务:

   1: static void FirstTaskMethod()
   2: {
   3:     Console.WriteLine(String.Format("Task {0} is doing something", Task.CurrentId));
   4:     Thread.Sleep(200);
   5: }
   6:  
   7: static void SecondTaskMethod(Task task)
   8: {
   9:     Console.WriteLine("Last task is finished");
  10:     Console.WriteLine(String.Format("Task {0} is doing something", Task.CurrentId));
  11:     Thread.Sleep(200);
  12: }

连续任务通过在任务上调用ContinueWith()方法来现实:

   1: static void Main(string[] args)
   2: {
   3:     Task task1 = new Task(FirstTaskMethod);
   4:     Task task2 = task1.ContinueWith(SecondTaskMethod);
   5:     task1.Start();
   6:  
   7:     for (int i = 0; i < 20; i++)
   8:     {
   9:         Console.WriteLine("Main thread is running");
  10:         Thread.Sleep(200);
  11:     }
  12:  
  13:     Console.Read();
  14: }

主线程循环输出字符串到控制台,Task1任务在另外一个线程里运行,FirstTaskMethod执行完继续SecondTaskMethod,结果如图:

image

值得注意的是,在一个任务结束时,可以启动多个任务,也就是说,任务的连接可以像一个树结构那样,如下代码:

   1: Task task1 = new Task(FirstTaskMethod);
   2: Task task2 = task1.ContinueWith(SecondTaskMethod);
   3: Task task3 = task1.ContinueWith(SecondTaskMethod);
   4: Task task4 = task2.ContinueWith(SecondTaskMethod);
   5: Task task5 = task2.ContinueWith(SecondTaskMethod);

无论前一个任务是如何结束的,后面的连续任务总是在前一个任务结束时启动。TaskContinuationOptions枚举提供了OnlyOnFaulted,NotOnFaulted,OnlyOnCanceled,NotOnCanceled,OnlyOnRunToCompletion几个选项。我们可以指定只有当前一个任务成功结束时才启动:

   1: Task task5 = task2.ContinueWith(SecondTaskMethod, TaskContinuationOptions.OnlyOnRanToCompletion);

 

 


 

参考资料:http://social.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/d72a956f-b44b-4017-aa98-f60d28c123c9

http://www.cnblogs.com/sosowjb/archive/2012/08/12/2634163.html

posted on 2013-03-12 16:50  jes.shaw  阅读(305)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3