我有麻烦了解如何解决我手头的问题。
我有一个包含大量产品的网站,为了用这些产品填充这些页面我称之为我的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
。
答案 0 :(得分:2)
您应该在Task.WhenAll前面放置await关键字:
var result = await Task.WhenAll(tasks.ToArray());
如果你没有等待任务,代码将在任务未完成时同步执行赋值语句var totalProducts = ..这将没有结果或抛出异常。