2014-04-01 52 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实例。

相关问题