簡體   English   中英

AWAIT / ASYNC和WebApi與FOREACH出現問題

[英]Trouble with AWAIT / ASYNC and WebApi with FOREACH

我有多個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新手,可能缺少一些簡單的東西

您提供的代碼將以串行方式逐個為每個提供程序調用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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM