Несколько таймеров ведут себя беспорядочно в .NET - PullRequest
0 голосов
/ 25 сентября 2018

Я создаю приложение, которое, по сути, запускает список программ с определенными интервалами, перечисленными в базе данных.

Существует 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);, является точной...

Кто-нибудь знает, что может быть причиной такого поведения?

1 Ответ

0 голосов
/ 25 сентября 2018

Проблема в том, что вы запускаете слишком много таймеров и никогда не останавливаете их.

Я подозреваю, что вы хотите установить Автосброс на false. По умолчанию true.

...