我正在开发一个应用程序,该应用程序每隔几分钟检索一次RSS源,并下载匹配一组标准的源上的项目。但是,我正在努力调试下面的代码。当我在代码中设置断点时,它不会越过GoThroughFeeds()
中的第一行。我怀疑我创建和处理任务的方式有问题。最初,我使用Task.Run()
创建了任务,但它们会运行两次(等待后的第二批)。我做错了什么?
private async void RunOnInterval(TimeSpan delay)
{
do
{
await GoThroughFeeds();
await Task.Delay(delay);
} while (true);
}
private async Task GoThroughFeeds()
{
Feed[] updatedFeeds = await Task
.WhenAll(Repository.Data.Feeds.Select(feed => new Task<Feed>(() => FetchRss(feed))));
// Do more stuff with the feeds
}
public Feed FetchRss(Feed feed)
{
feed.Items = Repository.GetItems(feed);
return feed;
}
答案 0 :(得分:2)
new Task<Feed>(() => FetchRss(feed))
错了。您正在尝试等待未启动的任务。实际上,几乎不会使用Task的构造函数。
Task.FromResult
也不好,因为它会同步执行你的代码,而不是将它卸载到另一个线程。
最后,Task.Run
完全符合您的需要。