Я хотел бы создать таймер, который вызывает метод каждые 24 часа в определенное время. Я не хочу делать это через Планировщик Windows, но вместо этого должен быть выполнен в коде. Вот код, я использую в настоящее время с помощью:Таймер каждые 24 часа в определенное время
DateTime now = DateTime.Now;
DateTime today = now.Date.AddHours(16);
DateTime next = now <= today ? today : today.addDays(1);
Systems.Threading.TimerCallback callback = new TimerCallback(DisplayMessage);
Systems.Threading.Timer timer = new System.Threading.Timer(callback, null, next - now, TimeSpan.FromHours(24));
Моя проблема заключается в том, что если next
заканчивается время всего в нескольких минутах ходьбы от текущего времени, то код работает и отображает сообщение через DisplayMessage()
. Если разница во времени превышает несколько минут, код не работает, никаких исключений, сбоев или чего-либо еще. Я попытался разместить записи журнала, окна сообщений и точки останова внутри DisplayMessage()
, чтобы убедиться, что я правильно вижу, когда вызывается DisplayMessage()
, но не повезло.
Вы посмотрели Quartz.net. – phuzi
Очевидный первый вопрос: вы держите ссылку на 'timer' до обратного вызова? Это необходимо для того, чтобы это не было GC'd. – McGarnagle
@McGarnagle, это, наверное, то, что есть, я попробую его и отчитаюсь завтра. Это объясняет, почему он работает в более короткие сроки. – Joshua