多个计时器在.NET中的行为不正常

时间:2018-09-25 13:02:13

标签: c# visual-studio timer windows-services

我正在构建一个应用程序,该应用程序实际上以数据库中列出的特定间隔运行一系列程序。

可以通过3种方式安排程序:

  • 以频率,即每天固定的次数
  • 在每天的特定时间
  • 每隔一定时间的频率,即02:00-04:00之间的4次

当使用单一类型的时间表运行单个程序时,我的程序可以完美运行并在正确的时刻进行时间表。 但是,当我尝试一次运行多个程序和一种以上类型的计划时,似乎出现了问题。 日程安排变得极为不稳定,并多次打开同一程序,或者运行过去在特定时间安排的程序。 我有一个函数,可以计算出下一个事件的确切毫秒数。在调试中,每次执行计算以及针对哪个程序时,我都会将此函数日志记录下来,并且在仔细检查这些日志后,它可以正常运行...这使我相信初始化计时器的方式可能有问题

这在我计划的任务类中,该类运行程序并创建下一个计时器:

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 :(得分:1)

问题在于您正在启动过多的计时器,而从未停止过它们。

我怀疑您要将AutoReset设置为false默认为true