Моделирование с использованием таймеров без ожидания - PullRequest
0 голосов
/ 08 ноября 2018

Я пишу базовую симуляцию в C#, и концептуально проще всего спроектировать ее как несколько таймеров, запускающих события с различными интервалами, начиная от полсекунды до нескольких секунд. Я набросал черновик, используя System.Timers.Timer, и он работает достаточно хорошо.

Однако, это всего лишь симуляция, поэтому я не хочу ждать! Есть ли способ мгновенно вызвать тот, который Timer сработает дальше?

Или, может быть, это неправильный подход, и я должен сделать что-то ручное (перебирая Dictionary задержек), как объяснено здесь ? Есть ли лучший образец для симуляции, подобной этой?

1 Ответ

0 голосов
/ 08 ноября 2018

Один из способов решения этой проблемы - использовать SortedList ожидающих событий (отсортированных по дате их истечения) и использовать таймер, который срабатывает достаточно часто, чтобы удовлетворить временные интервалы, вы хотите работать (например, здесь может хватить одного раза в 250 мс).

Каждый раз, когда срабатывает (одиночный) таймер, он продолжает проверять начало списка, и если элемент на фронте имеет дату истечения срока в прошлом, то мы снимаем с охраны элемент и организуем его запуск (независимо от того, выполняете ли вы запускать события в самом потоке таймера или, например, запускать новые Task s для их выполнения, зависит от степени того, должны ли события происходить параллельно и сколько времени занимает обработка событий).

Обычно каждый объект события имеет своего рода Action, встроенный в его структуру, так что этот код диспетчеризации может быть достаточно простым. Повторяющиеся события могут ставить в очередь их «следующее» выполнение как часть их собственных действий, или вы можете выбрать выполнение этой другой формы действия потоком таймера. (Эта вторая модель имеет тенденцию работать лучше, если вы выполняете параллельное выполнение, поскольку только очередь таймера взаимодействует с очередью событий, поэтому блокировка не требуется).

Наконец, как вы запускаете вещи чаще? Полностью отключите таймер и просто извлекайте элементы из очереди непрерывно, игнорируя их сроки выполнения.

...