2010-10-28 5 views
9

Ich möchte das Task-Framework in .NET verwenden, um etwas für die Ausführung in einem anderen Thread zu planen, dann, wenn es fertig ist, mit einer Operation zum Aktualisieren der Benutzeroberfläche im UI-Thread. (Ich habe nicht mit ihm noch viel gespielt, also ist es nicht sehr vertraut mir.)C# Task.ContinueWith Probleme

Hier ist der Code:

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) 
{ 
... 
} 

kann nicht implizit konvertiert Typ ‚System.Threading.Tasks.Task‘ zu 'System.Threading.Tasks.Task < System.Collections.Generic.List <Spark.Models.NewsItem> >'. Eine explizite Umwandlung existiert

Ich dachte, wenn ich die generische Signatur von List <NewsItem> die Aufgabe verwenden, dass die Task.Result diese Art zurückkehren würde, damit ich es auf meine Methode passieren könnte ... Was soll ich tun falsch hier?

+0

async/erwarten kann dieses Problem leicht lösen. –

+0

Ja, war nicht draußen, als ich das schrieb. – Kelly

Antwort

11

Das Problem ist, dass seit der Lambda ein Action<Task> ist, ContinueWith eine Task zurückgibt, und Sie zuweisen, dass zu fetchTask, die Task<List<NewsItem>> vom Typ ist. Beachten Sie, dass Sie das Ergebnis des Aufrufs ContinueWith der Variablen zuweisen, nicht das Ergebnis des Aufrufs new Task<>.

Wenn Sie etwas tun, wie folgt aus:

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

Sie werden feststellen, dass es ein Problem gibt becuase Ihre Lambda void zurückgibt, aber die Aufgabe erwartet eine Rendite von List<NewsItem>. Sie möchten das wahrscheinlich entweder von Ihren UpdateNewsItems zurückgeben oder die Aufgabe erstellen und die Fortsetzung später hinzufügen.