Как на C# выполнить метод в «очереди» раз в секунду, а не чаще?

Мне нужно, как только происходит определённое событие "Данные обновились"- запускать метод X -"Разослать обновлённые данные клиентам".
Но если событие вызывается, скажем 50 раз в секунду- нет необходимости столько же раз сразу же запускать метод X, создавая нагрузку.
Можно ли как-то поставить событие в очередь, и если очередь есть, запустить метод X- то выполнить только самое последнее событие?
Например 5-й клиент подключился. И вот подключается сразу же 6-й клиент, тоесть я должен сразу переслать обновлённую таблицу юзеров пяти клиентов (можно конечно пересылать,что подключился клиент такой-то, но я хочу сейчас именно всю таблицу клиентов онлайн переслать). По обычной логике- будет слаться много сообщений, но если сделать так, что б метод рассылки заблокировался на отправку, скажем на секунду, как только он выполнился и имел счётчик запусков. Тоесть за следующую сек пришло 20 попыток разослать данные, а он молчит и потом отсылает актуальные данные

Вариант 1: Есть 50 клиентов онлайн. Подключается 51-й. Я рассылаю 50+1 клиенту список клиентов онлайн. Подкл 52-й - делаем то же самое.
Вариант 2: Есть 50 клиентов онлайн. Подключается 51-й. Отсылаю так-же всё. Но тут подключается пара десятков человек и я должен так же всё рассылать.

Я хочу, если только что была рассылка- не отправлять сразу, а ждать, скажем, секунду и потом, если был запрос разослать данные- то сделать рассылку таблицы на текущий момент времени. Таким образом все клиенты получили данные- пусть не моментально, а на секунду позже, зато я не слал очень много раз.
Ну как-то так.
Может это конечно бред, интересно просто стало, как такое реализовать?
  • Вопрос задан
  • 473 просмотра
Пригласить эксперта
Ответы на вопрос 3
@Neonoviiwolf
Flutter developer
Делов-то, есть такая штука - таймер. Если кто-то подключился, рассылаются сообщения и запускается таймер, пока таймер не закончит отчёт, новые сообщения не могут быть отправлены.
Ответ написан
Комментировать
@Got_Oxidus
Учусь
Вот

+ моя идея:
  1. Сделать сам метод
  2. Запустить его в потоке Thread
  3. В этом методе написать Thread.Sleep(1000)//1сек
Ответ написан
Комментировать
@picolino


Почитайте про 4-й пункт, может, вам пригодится.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы