【问题标题】:Trouble with AWAIT / ASYNC and WebApi with FOREACH使用 FOREACH 的 AWAIT / ASYNC 和 WebApi 出现问题
【发布时间】:2014-06-27 05:21:24
【问题描述】:

我有多个 async 方法,它们从不同的基于 OAuth 的 REST Api 调用返回相同类型。

如果我直接调用一个,我可以取回数据:

//Call a specific provider
public async Task<List<Contacts>> Get()
{
    return await Providers.SpecificProvider.GetContacts();
}

但是,如果我尝试循环访问多个帐户,则对象会在 AWAIT 完成之前返回:

//Call all providers
public async Task<List<Contacts>> Get()
{
    return await Providers.GetContactsFromAllProviders();
}

public async Task<List<Contacts>> GetContactsFromAllProviders()
{
    var returnList = new List<Contacts>();
    //Providers inherits from List<>, so it can be enumerated to trigger
    //all objects in the collection
    foreach (var provider in Providers)
    {
        var con = await provider.GetContacts();
        returnList.Add(con);
    }
    return returnList;
}

我是 async 的新手,可能缺少一些简单的东西

【问题讨论】:

  • 不同的情况。他已经找到了另一种循环的解决方案,并且正在寻求效率。
  • 第一种方法中的async关键字是多余的。你可以简单地return Providers.SpecificProvider.GetContacts();

标签: c# asp.net-web-api async-await


【解决方案1】:

您提供的代码将以串行方式一一调用每个提供商的 Web 服务。我看不出您的声明对象在 AWAIT 完成之前返回是如何正确的,因为在循环内等待对 GetContacts 的调用。

但是,您可以并行调用它们而不是串行调用提供程序,这在大多数情况下应该会减少执行时间:

var tasks = providers.Select(provider => provider.GetContacts());

// Tasks execute in parallel - wait for them all to complete.
var result = await Task.WhenAll(tasks);

// Combine the returned lists into a single list.
var returnList = result.SelectMany(contacts => contacts).ToList();

【讨论】:

  • returnList.Add 被调用,但在所有项目都添加到它之前,returnList 已经返回。
  • await Task.WhenAll(tasks) 会更有效率,对吧?
  • @MattJohnson:是的,你是对的。我已经相应地更新了代码。
  • @Wesley,返回的是一个任务,完成后会有returnList
猜你喜欢
  • 2021-01-31
  • 2020-03-25
  • 1970-01-01
  • 2022-11-07
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
相关资源
最近更新 更多