© 2026 Hedgehog Software, LLC

TwitterGitHubDiscord
More
CommunitiesDocsAboutTermsPrivacy
Search
Star
Setup for Free
C#C
C#•4y ago•
4 replies
Doombox

Using multiple RateLimiters correctly. [Answered]

I'm wrapping an API which requires no more than 4 requests per second and 200 per hour, I've got a setup like this
_hourlyRateLimiter = new FixedWindowRateLimiter(new FixedWindowRateLimiterOptions(
    200, QueueProcessingOrder.OldestFirst, 1, TimeSpan.FromHours(1)));
_secondRateLimiter = new FixedWindowRateLimiter(new FixedWindowRateLimiterOptions(
    4, QueueProcessingOrder.OldestFirst, 1, TimeSpan.FromSeconds(1)));
// ...
public async Task Test(int testNumber)
{
    var hourly = _hourlyRateLimiter.WaitAsync();
    var second = _secondRateLimiter.WaitAsync();
    await ValueTaskExtensions.WhenAll(hourly, second);
    Console.WriteLine(testNumber);
}
_hourlyRateLimiter = new FixedWindowRateLimiter(new FixedWindowRateLimiterOptions(
    200, QueueProcessingOrder.OldestFirst, 1, TimeSpan.FromHours(1)));
_secondRateLimiter = new FixedWindowRateLimiter(new FixedWindowRateLimiterOptions(
    4, QueueProcessingOrder.OldestFirst, 1, TimeSpan.FromSeconds(1)));
// ...
public async Task Test(int testNumber)
{
    var hourly = _hourlyRateLimiter.WaitAsync();
    var second = _secondRateLimiter.WaitAsync();
    await ValueTaskExtensions.WhenAll(hourly, second);
    Console.WriteLine(testNumber);
}

this works well if you await each call of
Test
Test
, however if you try something like this...
var tasks = new List<Task>();
for (var i = 0; i < 250; i++)
    tasks.Add(Test(i));
await Task.WhenAll(tasks);
var tasks = new List<Task>();
for (var i = 0; i < 250; i++)
    tasks.Add(Test(i));
await Task.WhenAll(tasks);

the rate limiter seems to break, have I written this poorly or is this just an issue with concurrency in the library?
C# banner
C#Join
We are a programming server aimed at coders discussing everything related to C# (CSharp) and .NET.
61,871Members
Resources

Similar Threads

Was this page helpful?
Recent Announcements

Similar Threads

Query over multiple entities using the same interface [Answered]
C#CC# / help
4y ago
multiple capture groups regex [Answered]
C#CC# / help
4y ago
Correctly reading tabs from text file. [Answered]
C#CC# / help
4y ago