C#Task.ContinueWith问题

Kel*_*lly 9 c# task

我想在.NET中使用Task框架来安排某些东西在不同的线程上运行,然后在完成后继续执行更新UI线程上的UI的操作.(我还没有玩过它,所以对我来说不是很熟悉.)

这是代码:

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)
{
...
}
Run Code Online (Sandbox Code Playgroud)

无法将类型'System.Threading.Tasks.Task'隐式转换为'System.Threading.Tasks.Task <System.Collections.Generic.List <Spark.Models.NewsItem >>'.存在显式转换

我想如果我在Task.Result将返回该类型的任务上使用List <NewsItem>的通用签名,那么我可以将它传递给我的方法......我在这里做错了什么?

Phi*_*eck 11

问题是,因为你的lambda是一个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);
Run Code Online (Sandbox Code Playgroud)

你会注意到有一个问题,因为你的lambda返回void,但任务期望返回List<NewsItem>.因此,您可能希望从UpdateNewsItems返回该值,或者创建任务并稍后添加延续.