通過任務,可以指定在任務完成后,應開始運行另一個特定任務。任務處理程序或者不帶參數或者帶一個對象參數,而連續處理程序有一個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);
本文源代碼: