Какие таймеры зависят от системного времени?

Я еще не тестировал это. Я надеюсь, что кто-то уже знает ответ, поэтому мне не нужно писать тестовое приложение, иначе я это сделаю.:)

Обычно, когда я хочу сравнить время, я просто храню DateTime.Now и сравниваю его позже. Я считаю, что это дает неправильные результаты, когда пользователь меняет время системы пользователя где-то посередине.

Это заставило меня задаться вопросом, ведут ли таймеры то же самое. Какие таймеры .NET зависят от установленного системного времени? Подумайте о начале таймера, который должен пройти через один час. Будет ли это срабатывать, когда я установлю системное время на один час вперед?

Я никогда не заботился об этом возможном поведении, но это может быть важно в некоторых сценариях. Какие таймеры безопасны против этого сценария, а какие из них наиболее определенно не являются?

Ответ 1

Я просто цитирую комментарии Джима Мишеля, так как это самый важный ответ на мой вопрос.

Ни один из таймеров не зависит от системного времени. То есть пользователь изменение часов не повлияет на System.Windows.Forms.Timer, System.Timers.Timer или System.Threading.Timer. Также это не повлияет Stopwatch или Environment.TickCount. Кроме того, нет "накладных расходов" для используя Stopwatch. Это не похоже на то, что значение постоянно обновляется. Это лениво оценивается (т.е. Ticks обновляется, когда он ссылается).

Документация для Stopwatch говорит: "Время Stopwatch измеряет прошедшее время путем подсчета тиков таймера в базовом таймерном механизме. Если установленное оборудование и операционная система поддерживают высокое разрешение счетчик производительности, то класс Stopwatch использует этот счетчик измерьте прошедшее время". Если вы посмотрите информацию о высоком разрешении счетчик производительности, вы увидите, что он не зависит от системы время

Таймеры аналогичны. System.Threading.Timer основан на таймере Windows Таймеры очереди. См. Документацию. System.Timers.Timer - это просто обертка вокруг System.Threading.Timer. System.Windows.Forms.Timer является обертка вокруг функций Windows SetTimer и KillTimer. Документация для них указывает на то, что они не зависят от системное время.

Ответ 2

Я пытался решить подобную проблему. Я использую System.Diagnostic.StopWatch, чтобы заменить все DateTime.Now. StopWatch будет использовать частоту высоких частот, если она присутствует. Таким образом, он более точный и независимый от изменения системных часов. Однако, если часы высокой частоты отсутствуют, он снова вернется, чтобы снова использовать системные часы.

В соответствии с моим тестированием, все мои машины имеют часы с высокой частотой, включая машины в VM.

О таймере, насколько я помню, он не зависит от системных часов. Однако вы не хотите использовать таймер для отслеживания времени, потому что события обратного вызова таймера могут быть отложены другими событиями.