异步进行API调用

时间:2017-10-26 12:36:00

标签: c# asynchronous async-await

我有麻烦了解如何解决我手头的问题。

我有一个包含大量产品的网站,为了用这些产品填充这些页面我称之为我的API提供商名为GetProducts的方法。这很好用,但我想通过将此请求拆分为更小的请求并异步运行它来加快此过程。 GetProducts方法提供了pageNumber参数,我可以这样做以确保我获得不同的记录页。

所以,我尝试过不同的方法来解决这个问题,但我没有得到任何结果。代码示例:

int n = 0;
var tasks = new List<Task>();

// this method gets the total amount of products for the category
totalAmountOfProducts = MyApi.GetProductsCount(category);

while (n < totalAmountOfProducts / 200)
{
    for (int i = 0; i < 10; i++) 
    {
        tasks.Add(GetProductsAsync(category, i, 200));
    }

    n += i;
    Task t = Task.WhenAll(tasks.ToArray());
    var totalProducts = // add products from the last 10 iterations to total in some way
}

private async Task<ProductList> GetProductsAsync(string category, int pageNumber, int productAmount)
{
    return await Task.Run(() => MyApi.GetProducts(category, pageNumber, productAmount))
}

我该如何解决这个问题?我尝试了三种不同的版本,但它们最终都出现了错误或者没有做任何事情。但我意识到这是完全错误的...例如,我在await方法中运行GetProductsAsync,如果我正确理解的话,这会破坏Task t = Task.WhenAll(tasks.ToArray())行的目的,但这是摆脱所有错误消息的唯一方法,说明ProductList类型无法转换为System.Action

1 个答案:

答案 0 :(得分:2)

您应该在Task.WhenAll前面放置await关键字:

var result = await Task.WhenAll(tasks.ToArray());

如果你没有等待任务,代码将在任务未完成时同步执行赋值语句var totalProducts = ..这将没有结果或抛出异常。