Какие таймеры зависят от системного времени?
Я еще не тестировал это. Я надеюсь, что кто-то уже знает ответ, поэтому мне не нужно писать тестовое приложение, иначе я это сделаю.:)
Обычно, когда я хочу сравнить время, я просто храню 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.
О таймере, насколько я помню, он не зависит от системных часов. Однако вы не хотите использовать таймер для отслеживания времени, потому что события обратного вызова таймера могут быть отложены другими событиями.