2014-04-01 10 views
8

używam tego koduC# ContinueWith i Wynik zadania

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

I widzę, że t.Result równa 43 zamiast 86. Gdybym wydrukować coś w ContinueWith to pojawiają się w konsoli. Dlaczego wynik nie jest modyfikowany przez ContinueWith?

poważaniem

Odpowiedz

14

To dlatego ContinueWith stwarza zupełnie nowe zadanie, wskutek czego zignorować, a zamiast drukować wynik pierwszej, która jest prawnie 43. Spróbuj następujący fragment:

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 utworzy nowe zadanie, gdy pierwsze zadanie kompletne wykonanie to może być lub nie używać tego samego wątku, bo to zależy od harmonogramu zadań

Można użyć ContinueWith<TResult>(Func<Task, TResult>) w celu uzyskania wynik z drugiego zadania

Twój kod będzie wyglądać następująco

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

Pozostałe dwie odpowiedzi są poprawny. Istnieje inny Task zwrócony przez ContinueWith. Jeśli nie dbają o każdego kroku .. następnie kod może stać się o wiele mniejszy, przypisując wartość ContinueWith po ich łączenia:

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

// t.Result = 86 

Przekonasz się, że wiele z kodem zadaniowego Wynika to . Nieczęsto zdarza się, że utworzysz i uruchomisz poszczególne instancje Task po zakończeniu łączenia się z ContinueWith.

Powiązane problemy