C# Task的使用---連續的任務


通過任務,可以指定在任務完成之后,應開始運行之后另一個特定任務。例如,一個使用前一個任務的結果的新任務,如果前一個任務失敗了,這個任務就應執行一些清理工作。任務處理程序都不帶參數或者帶一個對象參數,而任務的連續處理方法都有一個Task類型的參數,這里可以訪問起始任務的相關信息:

如下面的示例代碼:

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Text;
   5: using System.Threading;
   6: using System.Threading.Tasks;
   7: namespace TaskSamples   
   8: {
   9:     class Program
  10:     {
  11:        
  12:         static void DoOnFirst()
  13:         {
  14:             Console.WriteLine("doing some task {0}",Task.CurrentId);
  15:             Thread.Sleep(3000);
  16:         }
  17:  
  18:         static void DoOnSecond(Task t)
  19:         {
  20:             Console.WriteLine("task {0} finished",t.Id);
  21:             Console.WriteLine("this task id {0}", Task.CurrentId);
  22:            Console.WriteLine("do some cleanup");
  23:            Thread.Sleep(3000);
  24:         }
  25:  
  26:                  
  27:         static void Main(string[] args)
  28:         {
  29:                        
  30:             Task t1 = new Task(DoOnFirst);
  31:             t1.Start();
  32:             Task t2 = t1.ContinueWith(DoOnSecond);
  33:             Task t3 = t1.ContinueWith(DoOnSecond);
  34:             Task t4 = t2.ContinueWith(DoOnSecond);
  35:             Console.ReadKey();
  36:           }
  37:     }
  38: }

連續任務通過在任務上調用ContinueWith()方法來定義。也可以使用TaskFactory類來定義。t1.ContinueWith(DoOnSecond)方法表示,調用DoOnSecond()方法的新任務應在任務t1結束時立即啟動。在一個任務結束時,可以啟動多個任務,連續任務也可以有另外一個連續任務。如下面的例子所示:

Task t1 = new Task(DoOnFirst);
t1.Start();
Task t2 = t1.ContinueWith(DoOnSecond);
Task t3 = t1.ContinueWith(DoOnSecond);
Task t4 = t2.ContinueWith(DoOnSecond);

 

運行結果如下圖所示:

image

 

使用TaskCreationOptions枚舉中的值,可以指定,連續的任務只有在起始任務成功(或者失敗)結束時啟動。一些可能的值是OnlyOnFaulted、NotOnFaulted 、OnlyOnCanceled、NotOnCanceled和OnlyOnRanToCompletion。

Task t5 = t1.ContinueWith(DoOnError, TaskContinuationOptions.OnlyOnFaulted);


免責聲明!

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



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