2014-04-01 9 views
8

ho utilizzare questo codiceC# ContinueWith e il Risultato del compito

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(); 
    } 

E mi accorgo che t.Result uguale a 43 invece di 86. Se stampo qualcosa nel ContinueWith apparire nella console. Perché il risultato non viene modificato da ContinueWith?

migliori saluti

risposta

14

Questo perché ContinueWith crea completamente nuovo compito, seguito della quale si ignora, e invece stampare il risultato del primo, che è giustamente 43. Provate il seguente frammento:

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 creerà una nuova attività quando la completa esecuzione primo compito che è può o non utilizzare lo stesso filo perché è indipendente dalla task scheduler

È possibile utilizzare ContinueWith<TResult>(Func<Task, TResult>) per ottenere il risultato dal secondo compito

il codice sarà simile a questo

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

le altre due risposte sono corretta. C'è un altro Task restituito tramite ContinueWith. Se non si cura di ogni singolo passo .. poi il codice può diventare molto più piccolo assegnando il valore del ContinueWith dopo di loro concatenamento:

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

// t.Result = 86 

troverete che un sacco di codice basata su attività segue questo . Non capita spesso di creare e avviare singole istanze Task quando si concatena lo ContinueWith alla fine.

Problemi correlati