Комментарии 23
А теперь в примере с двумя таймерами соберём мусор после создания таймеров и… Ничего не выводится, т.к. на таймеры нет ссылок и сборщик мусора их любезно убрал.
Да и в примере с 1000 таймеров тоже нет ссылок и сборщик мусора любезно убирает весь список со всеми таймерами.
Так как проект запущен в режиме «Debug» то все эти переменные будут «живы» до выхода из метода.
Это понятно, что в дебаге они будут живы, но не редки случаи, когда люди смотрят, что в дебаге работает, компилят в релиз и получают тыкву.
Мне кажется правильно было бы сделать об этом пометку в тексте статьи. Те, кто благодаря вашей статье наконец-то разберутся, как же работает таймер и что это такое, скорее всего очень удивятся подобному поведению GC.
А можно ли с помощью таймера ядра работать с отсечками менее 15 миллисекунд?
Windows — не ОСРВ, поэтому вообще проблематично что-либо гарантировать.
Ну а на тему таймеров была уже хорошая статья.
Ну а на тему таймеров была уже хорошая статья.
Ещё есть документик от Microsoft на тему таймеров.
А например в WinCE это будет работать, или там для этого нужно другие механизмы использовать?
Это приводит к добавлению экземпляра класса System.Threading.TimerQueueTimer в его внутреннюю очередь(являющуюся чем-то вроде LinkedList).Вот именно это-то момент и является для меня самым интересным — какую структуру данных они используют. Была бы гарантия, что там нормальная куча — использовал бы их, а так пришлось писать свой велосипед.
А чем вас не устроил LinkedList?
Там не используется LinkedList, способ внутреннего хранения таймеров схож с работой LinkedList. Раз такой интерес к этому способу хранения, я допишу об этом позже.
Тем, что на десяти тысячах таймеров он будет тормозить.
Насколько я понимаю, при реализации такого механизма таймеров, планировщику нужно после каждого срабатывания таймера последовательно и полностью пробегаться по коллекции и оценивать хранящиеся там значения интервалов. Во всех типах коллекций последовательный перебор работает более-менее одинаково же…
Это только до тех пор, пока коллекция неупорядоченная — в упорядоченной не требуется последовательного перебора. А в древовидных еще и вставка с удалением работают быстрее (чем в упорядоченных списках).
Недавно заметил такую особенность: когда создаешь объект System.Timers.Timer и запускаешь его, то все в порядке, пока веб сервер, в домене приложения которого создан таймер, не обрабатывает большое количество запросов. Если же веб-сервер находиться под нагрузкой (например нагрузочное тестирование с 500 одновременных подключений/запросов) то таймер перестает генерировать событие Elapsed. с чем это может быть связано?
Событие Elapsed генерируется в потоке пула. Если потоки пула оказались все заняты запросами и в итоге закончились — событие Elapsed будет ждать в очереди.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Timers in .Net