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,结果如图:
值得注意的是,在一个任务结束时,可以启动多个任务,也就是说,任务的连接可以像一个树结构那样,如下代码:
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);
本文源代码: