В основном я пытаюсь ограничить скорость выполнения итераций списка.
Мне очень нравится идея использования RX, так как я могу создать более элегантное решение, но это не обязательно делать с помощью RX.
Я сформулировал это с помощью многих, намного умнее меня. Моя проблема в том, что я хотел бы иметь возможность сказать someCollection.RateLimitedForEach(rate, function) и в конечном итоге заблокировать его, пока мы не закончим обработку. , или пусть это будет асинхронный метод.
Демонстрация под функцией работает в консольном приложении, но если я закрываю ее после foreach, она немедленно возвращается.
Я просто как-то в недоумении, поправимо ли это, или мне стоит совсем по другому поступить
public static void RateLimitedForEach<T>(this List<T> list, double minumumDelay, Action<T> action)
{
list.ToObservable().Zip(Observable.Interval(TimeSpan.FromSeconds(minumumDelay)), (v, _) => v)
.Do(action).Subscribe();
}
//rate limits iteration of foreach... keep in mind this is not the same thing as just sleeping for a second
//between each iteration, this is saying at the start of the next iteration, if minimum delay time hasnt past, hold until it has
var maxRequestsPerMinute = 60;
requests.RateLimitedForeach(60/maxRequestsPerMinute,(request) => SendRequest(request));