zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    跑酷游戏的一些bug总结(滥用FixedUpdate的坑)
    Unity在编辑器状态下清空控制台信息
    Unity脚本在层级面板中的执行顺序测试3
    IronPython使用
    RSA加密的测试demo
    常用加密算法学习
    c#读写ini文件
    Jrebel激活方法(转)
    ThreadLocal Memory Leak in Java web application
    Java Thread Local – How to use and code sample(转)
  • 原文地址:https://www.cnblogs.com/jes_shaw/p/2956025.html
Copyright © 2011-2022 走看看