回答

9

有時你會從外面收到一份任務,並希望將其延續鏈接到它。還有一些方法可以創建沒有Action的任務(例如使用TaskCompletionSource)。

5

任務延續允許你任務的鏈,鏈中的每個任務之後是一個其他任務

同樣在Task.ContinueWith方法可以異步地檢查TaskTaskContinuationOptions當目標Task完成或出現錯誤

Task task = Task.Factory.StartNew 
(
    () => 
     { 
      //Your action when the task started 
     } 
); 

task.ContinueWith 
(
    _ => 
     { 
      //Your action when the task completed 
     }, 
    CancellationToken.None, 
    TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent, 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 

task.ContinueWith 
(
    (t) => 
     { 
      //Action when error occured 
      Exception exception = null; 

      if (t.Exception.InnerException != null) 
      { 
      exception = t.Exception.InnerException; 
      } 
      else 
      { 
      exception = t.Exception; 
      } 

      //You can use this exception 
     }, 
    CancellationToken.None, 
    TaskContinuationOptions.OnlyOnFaulted | TaskContinuationOptions.AttachedToParent, 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 

欲瞭解更多信息,看看here

10

薩沙Goldshtein的答案是正確的。有些情況下,您的「繼續」組合代碼無法直接訪問,甚至無法設置任務的執行方法。例如,一個想要彙總taks的可插拔系統。

但是,還有另一個可能適用的原因。粒度

考慮可能會引起使用TaskCreationOptions.LongRunning的要求。在正在調度,執行和完成數百個進程的並行系統中,任務調度程序正在努力在調度任務時提高處理器的親和力。

如果您處於可以將任務細分爲細粒度子任務並鏈接它們的情況,則不再需要使用TaskCreationOptions.LongRunning。簡單地說,這將會更好地執行,因爲更容易同時安排100個小任務,而不是在只有4個核心可用的環境中安排10個大任務來完成相同任務。請記住,鏈接任務不保證在先行後立即啓動。

這是一個有趣的問題,只有當您需要一個可擴展的系統時纔會成爲問題。

如果你問我,你應該儘可能使用ContinueWith(),因爲它會幫助你的應用程序擴展。