Я бы использовал семафор, чтобы отследить, сколько вызовов в API в настоящее время выполняется, а затем выпускал один при каждом завершении вызова.Примерно так:
public class Throttle
{
private readonly TimeSpan perPeriod = TimeSpan.FromSeconds(1);
private readonly SemaphoreSlim actionSemaphore = new SemaphoreSlim(5, 5);
public async Task Queue(Func<Task> action, CancellationToken cancel)
{
await actionSemaphore.WaitAsync(cancel);
try
{
await action();
}
finally
{
await Task.Delay(perPeriod, cancel).ContinueWith(_ => actionSemaphore.Release(1), cancel);
}
}
}
perPeriod будет установлен на 1 секунду, а actionSemaphore будет установлен на 5, что означает, что он позволит запускать 5 запросов одновременно.Вы бы назвали это следующим образом:
Throttle t = new Throttle();
t.Queue(SomeAction, CancellationToken.None);
Затем можно дождаться завершения всех задач.