2010-10-28 12 views
9

Chciałbym użyć platformy Task w .NET, aby zaplanować coś do uruchomienia w innym wątku, a następnie po zakończeniu operacji, aby zaktualizować interfejs użytkownika w wątku UI. (Nie grałem z nim jeszcze dużo, więc nie jest to bardzo znajomo.)C# Task.ContinueWith issues

Oto kod:

Task<List<NewsItem>> fetchTask = new Task<List<NewsItem>>(() => 
     { 
      List<NewsItem> items = Rss.FetchNewsItems(feed); 
      return items; 
     }).ContinueWith(x => UpdateNewsItems(x.Result),CancellationToken.None,TaskContinuationOptions.None,scheduler); 


private void UpdateNewsItems(List<NewsItem> items) 
{ 
... 
} 

nie można niejawnie przekonwertować typu „System.Threading.Tasks.Task” do 'System.Threading.Tasks.Task < System.Collections.Generic.List <Spark.Models.NewsItem> >'. Wyraźne konwersji istnieje

Pomyślałem, że jeśli mogę użyć rodzajowy podpis listy <NewsItem> na zadaniu, że Task.Result wróci ten typ tak mogę przekazać go do mojej metody ... Co robię źle tutaj?

+0

async/await może łatwo rozwiązać ten problem. –

+0

Tak, nie było, kiedy to pisałem. – Kelly

Odpowiedz

11

Problem jest, że skoro twój lambda jest Action<Task>, ContinueWith zwraca Task, a ty, że przypisanie do fetchTask, która jest typu Task<List<NewsItem>>. Zauważ, że przypisujesz wynik zmiennej ContinueWith, a nie wynik połączenia new Task<>.

Jeśli zrobisz coś takiego:

var fetchTask = 
     new Task<List<NewsItem>>(() => 
     { 
      List<NewsItem> items = Rss.FetchNewsItems(feed); 
      return items; 
     }) 
     .ContinueWith<List<NewsItem>>(
      x => UpdateNewsItems(x.Result), 
      CancellationToken.None, 
      TaskContinuationOptions.None,scheduler); 

można zauważyć, że nie jest to problem ponieważ posiadał swoją lambda zwraca void, ale zadanie oczekuje powrotu List<NewsItem>. Więc prawdopodobnie chcesz to albo zwrócić z UpdateNewsItems, albo utworzyć zadanie i dodać kontynuację później.