如何为列表中的每个项目运行Task.WhenAll方法并存储结果?

时间:2016-12-04 15:19:43

标签: c# asynchronous async-await task

我正在开发一个应用程序,该应用程序每隔几分钟检索一次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;
}

1 个答案:

答案 0 :(得分:2)

new Task<Feed>(() => FetchRss(feed))错了。您正在尝试等待未启动的任务。实际上,几乎不会使用Task的构造函数。

Task.FromResult也不好,因为它会同步执行你的代码,而不是将它卸载到另一个线程。

最后,Task.Run完全符合您的需要。