对于每个项目,我使用 await 调用一个方法。我将如何同时执行此操作?

Foreach item I call a method using await. How would I do this simultaneously instead?

我的应用程序中有以下方法

public async void Method()
{
    bool updated = false;

    foreach (Feed feed in Feeds)
    {
        if (await feed.Update())
        {
            updated = true; // At least one feed was updated
        }
    }

    if (updated)
    {
        // Do Something
    }
}

如您所见,方法 Update() 对列表中的每个项目都一个接一个地调用。相反,我想同时对所有项目调用它,并知道其中一个是否成功。

方法 Update() 在 class Feed

中找到
public async Task<bool> Update()
{
    try
    {
        WebRequest wr = WebRequest.Create(URL);
        wr.Timeout = 5000;

        using (WebResponse response = await wr.GetResponseAsync())
        {
            XmlDocument feed = new XmlDocument();
            feed.Load(response.GetResponseStream());

            // Do Something
            return true;
        }
    }
    catch (WebException we)
    {
        return false;
    }
}

编辑:

到目前为止,我一直在尝试使用带有和不带有 return 值的异步方法来解决这个问题。

public async void Update()
{
    if (await UpdateFeeds())
    {
        // Do something
    }
}

public async Task<bool> UpdateAllFeeds()
{
    // Update all the feeds and return bool
}

然后我意识到我在 UpdateAllFeed() 中仍然会遇到同样的问题。如果我将 Feed 中的 Update() 更改为 async void 方法,它们可以同时 运行,但那样我就没有回调了。

我不知道如何 运行 多个异步方法并且只在它们全部完成时才回调。

创建 Task<bool> 的列表,然后使用 Task.WhenAll

List<Task<bool>> tasks = new List<Task<bool>>();
foreach (var feed in feeds)
{
    tasks.Add(feed.Update());
}

await Task.WhenAll(tasks);

var updated = (from t in tasks where t.Result select t).Any();
public async void Method()
{
  bool updated = false;

  Parallel.ForEach(Feeds, feed => 
  {
    if (feed.Update())
        updated = true; // At least one feed was updated
  });

  if (updated)
  {
    // Do Something
  }
}