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

本文源代碼:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM