2014-04-01 80 views
8

的結果我用這個代碼C#ContinueWith和任務

public static void Main() 
    { 
     Task<int> t = new Task<int>(() => { return 43; }); 
     t.Start(); 
     t.ContinueWith((i) => {return i.Result * 2; }); 

     Console.WriteLine("i = {0}", t.Result.ToString()); 

     Console.Read(); 
    } 

而且我注意到,t.Result等於43,而不是86 如果我打印的ContinueWith東西它出現在控制檯。 爲什麼ContinueWith不會修改結果?

問候

回答

14

這是因爲ContinueWith創造完全新的任務,結果是你忽略了,而是打印的第一個,這是理所當然43的結果。試試下面的代碼片段:

Task<int> t = new Task<int>(() => { return 43; }); 
t.Start(); 
var t2 = t.ContinueWith((i) => {return i.Result * 2; }); 

Console.WriteLine("i = {0}", t2.Result.ToString()); 
2

ContinueWith將創建一個新的任務時,第一個任務完成執行是因爲它依賴於任務調度可能會或不會使用相同的線程

你可以爲了得到使用ContinueWith<TResult>(Func<Task, TResult>)從第二個任務的結果

您的代碼將是這個樣子

static void Main(string[] args) 
     { 

      Task<int> t = new Task<int>(() => { return 43; }); 
      t.Start(); 
      Task<int> t2 = t.ContinueWith<int>((i) => { return i.Result * 2; }); 

      Console.WriteLine("i = {0}", t2.Result.ToString()); 

      Console.Read(); 

     } 
3

另外兩個答案正確。還有另一個Task通過ContinueWith返回。如果你不關心每個個體步驟的..然後你的代碼可以串聯起來,之後成爲分配ContinueWith的值要小得多:

var t = Task.Run(() => 43) 
     .ContinueWith(i => i.Result * 2); 

// t.Result = 86 

你會發現,很多基於任務的代碼如下這。當你最終鏈接ContinueWith時,通常不會創建並啓動個體Task實例。

相關問題