Модель, которую вы используете, используя таймер с одним выстрелом, определенно является подходящим вариантом. Вы, конечно, не хотите создавать новую тему для каждого из них. Вы могли бы иметь один поток и очередь приоритетных действий, назначенных вовремя, но это излишняя сложность.
Вызов Dispose
в обратном вызове, вероятно, не очень хорошая идея, хотя я бы хотел попробовать. Кажется, я вспоминал, как делал это в прошлом, и это работало нормально. Но я признаю, что это довольно странная вещь.
Вы можете просто удалить таймер из коллекции и не утилизировать его. Без ссылок на объект он будет иметь право на сборку мусора, а это означает, что метод Dispose
будет вызываться финализатором. Просто не так своевременно, как хотелось бы. Но это не должно быть проблемой. Вы просто протекаете ручку на короткое время. До тех пор, пока у вас нет тысяч таких вещей без присмотра в течение длительного периода времени, это не будет проблемой.
Другой вариант - иметь очередь таймеров, которая остается выделенной, но деактивированной (то есть их время ожидания и интервалы установлены на Timeout.Infinite
). Когда вам нужен таймер, вы извлекаете его из очереди, устанавливаете его и добавляете в свою коллекцию. Когда время ожидания истекает, вы очищаете таймер и возвращаете его в очередь. При необходимости вы можете динамически наращивать очередь и время от времени даже ухаживать за ней.
Это предотвратит утечку одного таймера на каждое событие. Вместо этого у вас будет пул таймеров (очень похоже на пул потоков, нет?).