C#Task.ContinueWith问题

时间:2010-10-28 14:51:00

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

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

我认为如果我使用List&lt; NewsItem&gt;的通用签名关于Task.Result将返回该类型的任务,所以我可以将它传递给我的方法... 我在这里做错了什么?

1 个答案:

答案 0 :(得分: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);

你会注意到有一个问题,因为你的lambda返回void,但是任务期望返回List<NewsItem>。所以你可能想要从UpdateNewsItems返回它,或者创建任务并稍后添加延续。