问题与AWAIT / ASYNC和WebApi与FOREACH

本文关键字:WebApi FOREACH AWAIT 问题 ASYNC | 更新日期: 2023-09-27 18:10: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的新手,我可能错过了一些简单的

问题与AWAIT / ASYNC和WebApi与FOREACH

您提供的代码将以串行方式逐个调用每个提供者的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();