2015-11-17 3 views
3

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

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, я мог бы принять это в домашней версии, но не в качестве продукта п.

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

+0

Изменить триггер, например, на 0:01 вместо 0:00? – shurik

+0

ok Я могу это сделать, но почему это происходит? – kosnkov

+1

Вот аналогичный вопрос о SU: [Почему планировщик задач Windows запускает мои задачи раньше?] (Http://superuser.com/questions/396237/why-is-windows-task-scheduler-starting-my-tasks- рано). Если я должен был догадаться, я бы сказал, что это проблема с ограничением таймера. – vanneto

ответ

5

Просмотрите статью Эрика Липперта о точности или, точнее, недостатке DateTime. Link here.

Ключевой пункт из статьи:

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

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