using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
private const int ApiLimit = 10;
static void Main(string[] args)
var apiRequestCount = 20;
for(int i = 0; i < apiRequestCount; i++)
private static int count = 0;
private static void PrintTime()
Console.WriteLine($"[{FormatTimestamp(DateTime.Now)}]: Request #{++count}");
private static List<DateTime> requests = new List<DateTime>();
private static object _requestLimitLock = new object();
private static void EnforceRateLimit()
var ratedRequests = requests.Where(item => (DateTime.Now - item).TotalMilliseconds <= 1000).ToList();
if (ratedRequests.Count >= ApiLimit)
var timeSinceOldestRequest = (DateTime.Now - ratedRequests.First()).TotalMilliseconds;
var timeToWait = 1000 - timeSinceOldestRequest;
Console.WriteLine($"\n[{FormatTimestamp(DateTime.Now)}]: waiting {timeToWait:N2}ms, until {FormatTimestamp(DateTime.Now.AddMilliseconds(timeToWait))}\n");
Thread.Sleep((int)timeToWait);
requests.Add(DateTime.Now);
requests.RemoveAll(item => (DateTime.Now - item).TotalMilliseconds > 2000);
private static string FormatTimestamp(DateTime time)
return $"{time.Minute}:{time.Second}:{time.Millisecond}";