Как реализовать эффективный алгоритм ограничения скорости (N выполнения определенного действия за промежуток времени) при использовании .Net 4.0/4.5 Задачи? Например, я хочу, чтобы SendMessageAsync
блокировал (не отправляя другое сообщение), если больше N сообщений, отправленных за секунду.Эффективное ограничение скорости асинхронных задач (N выполнений за промежуток времени)
await Task.WhenAll(
Enumerable.Range(0, TOTAL_MESSAGES)
.Select(async x =>
{
await clientSession.SendMessageAsync(CreateMessage());
}));
Я попытался с помощью Task.Delay
внутри SendMessageAsync
, но так как в ожидании Task.Delay
мгновенную возвращается, то следующее сообщение будет отправлено без блокировки.
public async Task<ResponseMessage> SendMessageAsync(RequestMessage message)
{
int sleepTime;
if (throttler.ShouldThrottle(out sleepTime))
{
await Task.Delay(sleepTime);
}
return await InternalMessageWithoutWaitingAsync(message);
}
Я мог бы изменить await Task.Delay(sleepTime)
в Thread.Sleep(sleepTime)
таким образом ждет, прежде чем асинхронная, но мне интересно, если это хорошая практика, при использовании задач.
Я бы только начать следующую задачу, когда сигналы «throttler», «идти». Я считаю, что лучший шаблон, чем запуск всех задач и ожидание сразу с большинством из них. – usr
Операции, зависящие от времени, такие как дросселирование * по интервалу времени *, лучше всего использовать с использованием Rx вместо 'async'. –
@usr - или передать задание дросселю и позволить ему начинать его, когда он думает, что это правильно. В любом случае - почему бы вам не написать это как ответ? – Vadim