C# Task.ContinueWith问题

9
我希望使用.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)
{
...
}

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

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


async/await 可以轻松解决这个问题。 - Lei Yang
是的,在我写这篇文章时还没有发布。 - Kelly
1个回答

11
问题在于,由于你的lambda是一个Action<Task>,所以 ContinueWith 返回一个 Task,而你将其赋值给了类型为 Task<List<NewsItem>> 的变量 fetchTask。请注意,你正在将 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);

你会注意到一个问题,因为你的lambda返回空,但任务需要返回List<NewsItem>。所以你可能想要从UpdateNewsItems返回它,或者创建任务并稍后添加继续操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接