2014-10-22 89 views
3

我有兩個ContinueWith任務。第一個處理任務成功完成時的情況,第二個處理失敗時的情況。 然後我等到他們中的一個完成。 的示例代碼如下: Task.WaitAll和取消的任務

var task = Task.Factory.StartNew(() => { Console.WriteLine("Task is finished"); }); 
var success = task.ContinueWith(
    t => Console.WriteLine("Success") 
    , TaskContinuationOptions.OnlyOnRanToCompletion 
    ); 
var failed = task.ContinueWith(
    t => Console.WriteLine("Failed") 
    , TaskContinuationOptions.NotOnRanToCompletion 
    ); 

try 
{ 
    Task.WaitAll(success, failed); 
} 
catch (AggregateException ex) 
{ 
    Console.WriteLine(ex.InnerException.Message); 
} 

我的問題是,是否有可能重寫,以避免TaskCanceledException提高?

+2

'WaitAll'不等到一個完成,那就是'WaitAny'。 – 2014-10-22 07:48:43

+0

了WaitAny將在當他們中的一個,而無需等待時的實際行動將完成將被取消時刻通過 – 2014-10-22 07:51:04

+0

是的,我只是在校正時,路人閱讀和思考'WaitAll'等待一個來完成,而不是術語另一個。 – 2014-10-22 07:53:20

回答

2

當你想擁有成功和失敗處理,我看不出有任何理由讓他們在不同的ContinueWith()電話。一個電話,這總是會發生應該足夠:

var continuation = task.ContinueWith(
    t => 
    { 
     if (t.IsFaulted) 
      Console.WriteLine("Failed"); 
     else 
      Console.WriteLine("Success"); 
    }); 

continuation.Wait(); 

假設task將永遠不會被取消,這將表現得幾乎與您的原代碼。

+0

謝謝svick,通常我使用你描述的方法。但有時有理由說,爲什麼最好有兩個不同的'ContinueWith',例如當「successWith'應該有它自己的'ContinueWith'時,我們有」成功「和」失敗「的不同調度器。ContinueWith ' – 2014-10-25 20:28:20