我想在.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返回该值,或者创建任务并稍后添加延续.