Ожидание счета в скользящем временном окне до go вниз перед выполнением запроса - PullRequest
0 голосов
/ 31 марта 2020

Допустим, у меня есть функция, которая может быть запущена в любой момент времени, и у этой функции иногда есть много запросов, а иногда и мало, но я никогда не хочу делать больше 20 запросов в минуту. Однако я всегда хочу, чтобы все запросы выполнялись.

foreach (var user in users)
{
    while (requestsInLastMinute < 20)
    {
        // Waiting for requests to get freed
        Thread.Sleep(1000);
    }

    user.ExecuteRequest();

    requestsInLastMinute++;
}

Существует ли эффективный способ сделать это, но где счетчик считает только запросы, выполненные в последнюю минуту?

1 Ответ

1 голос
/ 31 марта 2020

Вот простое решение:

var requestsInLastMinute = 0;
var lastMinute = DateTime.Now.Minute;

foreach (var user in users)
{
    while (requestsInLastMinute >= 20)
    {
        if (DateTime.Now.Minute != lastMinute)
        {
            requestsInLastMinute = 0;
            lastMinute = DateTime.Now.Minute;
            break;
        }
        else
        {
            Thread.Sleep(1000);
        }
    }

    user.ExecuteRequest();
    requestsInLastMinute++;
}

Решение на основе MemoryCache:

MemoryCache cache = new MemoryCache("my memory cache");

foreach (var user in users)
{
    while (cache.Count() >= 20)
    {
        Thread.Sleep(1000);
    }

    user.ExecuteRequest();
    cache.Add(new CacheItem(Guid.NewGuid().ToString()), new CacheItemPolicy() { AbsoluteExpiration = DateTime.Now.AddMinutes(1) });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...