我想在.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将返回该类型的任务,所以我可以将它传递给我的方法... 我在这里做错了什么?
答案 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返回它,或者创建任务并稍后添加延续。