代码之家  ›  专栏  ›  技术社区  ›  Tiaan

在.NET中,多个计时器的行为不稳定

  •  0
  • Tiaan  · 技术社区  · 6 年前

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

    计划有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 回复  |  直到 6 年前
        1
  •  1
  •   mjwills Myles McDonnell    6 年前

    问题是,你启动了过多的计时器,却从来没有停止过。

    我怀疑你想 AutoReset false . true .