Планировщик задач запускает задачу на несколько миллисекунд раньше

У меня есть задача с триггером:

At 0:00 every day - after triggered, repeat every 1 hours for a duration of 1 day.

И внутри моего приложения я читаю время так:

dateTimeUtcNow = DateTime.Now;

И иногда, очень редко, dateTimeUtcNow показывает время за несколько миллисекунд до полного часа, например 2015-11-11 14:59:59,914

Сервер работает на Windows Server 2012 R2, я мог бы принять это в домашней версии, но не в рабочей.

Почему? Это ошибка? Как я могу предотвратить это?


person kosnkov    schedule 17.11.2015    source источник
comment
Изменить триггер, например, на 0:01 вместо 0:00?   -  person shurik    schedule 18.11.2015
comment
хорошо, я могу это сделать, но почему это происходит?   -  person kosnkov    schedule 18.11.2015
comment
Вот аналогичный вопрос по SU: Почему запускается планировщик заданий Windows мои задачи рано? Если бы мне пришлось угадывать, я бы сказал, что это проблема с ограниченной точностью таймера.   -  person mishmash    schedule 18.11.2015
comment
@shurik Это заставит его работать с опозданием. Лучше всего проверить, соответствует ли текущее время тому, что вы хотите, и при необходимости перенести его/перейти в спящий режим.   -  person WalterM    schedule 18.11.2015
comment
86 миллисекунд - это намного раньше. Находится ли запланированная задача и принимающее приложение на одном компьютере?   -  person Shyamal Desai    schedule 18.11.2015
comment
Если машина находится в NTP, это могло вызвать проблему.   -  person Shyamal Desai    schedule 18.11.2015
comment
Я полагаю, это связано с тем, что операционная система Windows не работает в режиме реального времени. система   -  person Default    schedule 18.11.2015
comment
Аналогичный пост здесь также содержит ответ.   -  person Default    schedule 18.11.2015


Ответы (1)


Ознакомьтесь со статьей Эрика Липперта о точности или, скорее, об отсутствии DateTime. Ссылка здесь.

Ключевой абзац из статьи:

Короче говоря, вопрос «сколько сейчас времени?» на самом деле следует отвечать только с уровнем точности, который отражает уровень точности, присущий системе. Большинство компьютерных часов не синхронизированы точно даже с точностью до миллисекунды официального времени, и поэтому точность за пределами этого уровня точности является ложью. На мой взгляд, весьма прискорбно, что структура DateTime показывает такую ​​точность, потому что кажется, что операции над этой структурой должны быть точными и на этом уровне. Но почти наверняка они не так точны.

Если вам действительно нужно, чтобы таймер срабатывал до полуночи, а не раньше, вам придется установить «слегка» будущую дату/время, как уже было предложено в комментариях. У вас действительно нет больше контроля, чем это.

person Paul Sasik    schedule 17.11.2015