【发布时间】:2021-04-03 10:40:47
【问题描述】:
我有一个分页的 Rest API 并希望接收所有记录。目前我循环直到同步接收到所有记录。
现在我想改变行为,因为很长一段时间,直到收到所有记录。我想要做的是启动分配给 List
protected async Task<List<T>> GetAll<T, TListObject>() where TListObject : ApiListModel<T> {
var limit = this.GetRequestLimit();
var token = this.GetBearerToken();
var maxConcurrent = _config.GetValue<int>("Blackduck:MaxConcurrentRequests");
var list = new List<T>();
var tasks = new List<Task<TListObject>>();
//Request first page to get total count
var resp = await this.GetPage<TListObject>(0, limit);
list.AddRange(resp.Items);
var total = resp.TotalCount;
for (int i = 0; i < maxConcurrent; i++)
{
tasks.Add(this.GetPage<TListObject>(0, 0)); // TODO: 0, 0 should be replaced with the offset and limit
}
TListObject result;
while (list.Count < total || (result = Task.WhenAny<TListObject>(tasks)))
{
}
return list;
}
但现在我暂时无法使用Task.WhenAny<T>() 开始下一次运行,直到收到所有记录。有人知道如何开始下一页吗?
BR
【问题讨论】:
-
你可以使用Semaphore(Slim)
-
相关:How to limit the amount of concurrent async I/O operations? 一个新的 API
Parallel.ForEachAsync可能会在下一个主要的 .NET 版本中提供,但现在你必须手动进行限制,或者使用一些第三方图书馆。
标签: c# .net-core async-await dotnet-httpclient