2010-10-28 68 views
9

我想使用.NET中的任務框架來安排在不同線程上運行的東西,然後在完成後繼續執行更新UI線程上的UI的操作。 (我還沒有發揮它的還不很多,所以它不是很熟悉我。)C#任務繼續有問題

下面是代碼:

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

無法隱式轉換類型「System.Threading.Tasks.Task」來'System.Threading.Tasks.Task < System.Collections.Generic.List <Spark.Models.NewsItem> >'。顯式轉換存在

我想,如果我使用List <NewsItem>的一般簽名的任務是,Task.Result都將返回一個類型,所以我可以將它傳遞給我的方法... 我在做什麼這裏錯了嗎?

+0

異步/等待可以很容易地解決這個問題。 – 2016-06-28 14:51:17

+0

是的,當我寫這個時沒有出來。 – Kelly 2016-07-03 04:08:53

回答

11

的問題是,既然你的拉姆達是Action<Task>,ContinueWith返回一個Task,並且您將其賦值給fetchTask,這是Task<List<NewsItem>>類型。請注意,您將ContinueWith調用的結果分配給變量,而不是new Task<>調用的結果。

如果你做這樣的事情:

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

你會發現,你的監守拉姆達返回void,但任務預計List<NewsItem>回報有問題。所以你可能想要從UpdateNewsItems中返回它,或者創建任務並在稍後添加延續。