Асинхронные http-запросы
Я хочу реализовать специальный http-клиент, который будет накладывать ограничение на отправку запросов (например, запрос можно делать не чаще, чем раз в секунду). Я написал следующий код:
public class SmartClient
{
private readonly HttpClient _client;
private static DateTime? _lastRequest = null;
public SmartClient()
{
_client = new();
}
public async Task<string> Get(string url)
{
while (true)
{
if (_lastRequest != null && _lastRequest.Value.AddSeconds(1) > DateTime.Now)
{
await Task.Delay(100);
continue;
}
break;
}
_lastRequest = DateTime.Now;
Console.WriteLine($"Request: {url}");
var request = new HttpRequestMessage(HttpMethod.Get, url);
var response = await _client.SendAsync(request);
return await response.Content.ReadAsStringAsync();
}
}
Далее я инициализирую 10 объектов SmartClient
, создаю на каждый по одной таске .Get()
и помещаю все задачи в один список. Потом вызываю await Tasks.WaitAll(tasks);
и жду, что все мои запросы выполнятся в течение 10 секунд. Но на практике получаю несколько одновременных запусков по несколько запросов за раз. Что я делаю не так?