Асинхронные 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 секунд. Но на практике получаю несколько одновременных запусков по несколько запросов за раз. Что я делаю не так?


Ответы (0 шт):