2010-10-28 66 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中返回它,或者创建任务并在稍后添加延续。