Я создаю приложение, которое, по сути, запускает список программ с определенными интервалами, перечисленными в базе данных.
Существует 3 вида планирования программы:
- с частотой, то есть установленным количеством раз в день
- В определенное время каждый день
- с частотой между определенным временем, то есть 4 раза между 02: 00-04: 00
Когда я запускаю одну программу с одним типом расписания, моя программа работает отлично и планирует точно в нужный момент.Но проблема, кажется, возникает, когда я пытаюсь запустить более одной программы и более одного типа расписания одновременно.Расписание становится крайне нестабильным и несколько раз открывает одну и ту же программу или запускает программу, которая была запланирована на определенное время в прошлом.У меня есть функция, которая вычисляет точные миллисекунды до следующего события.В отладке я записывал эту функцию в журнал каждый раз, когда она выполняет вычисления и для какой программы, и после тщательного изучения этих журналов она отлично работает ... что наводит меня на мысль, что может быть что-то не так с тем, как я инициализирую таймеры.
Это мой класс запланированных задач, который запускает программу и создает следующий таймер:
public void OnTimer(object sender, System.Timers.ElapsedEventArgs args)
{
taskSchedule.process = System.Diagnostics.Process.Start(SystemFunctions.getFullExePath(taskSchedule));
SystemFunctions.setLastTimeTaskRun(taskSchedule.id, DateTime.Now);
taskSchedule.lastRun = DateTime.Now;
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = SystemFunctions.determineNextTaskEvent(taskSchedule);
timer.Elapsed += new System.Timers.ElapsedEventHandler(this.OnTimer);
timer.Start();
taskSchedule.timerservice = timer;
}
Новая версия этого класса создается каждый раз для каждой программы и каждого расписанияэта программа.Таким образом, каждый таймер и программа работают независимо.
Вот как создается класс запланированных задач:
private void startScheduledTasks()
{
List<TaskSchedule> taskSchedule = SystemFunctions.getTaskSchedules();
if (taskSchedule != null)
{
foreach (TaskSchedule currentTask in taskSchedule)
{
ScheduledTask scheduledTask = new ScheduledTask();
scheduledTask.taskSchedule = currentTask;
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = SystemFunctions.determineNextTaskEvent(currentTask);
timer.Elapsed += new System.Timers.ElapsedEventHandler(scheduledTask.OnTimer);
timer.Start();
currentTask.timerservice = timer;
scheduledTasks.Add(scheduledTask);
}
}
}
Как я уже говорил, я проверял, что мс, полученная от SystemFunctions.determineNextTaskEvent(currentTask);
, является точной...
Кто-нибудь знает, что может быть причиной такого поведения?