2012-02-09 99 views
0

我知道我总是在这里找到很好的答案,所以我有一个新的具有挑战性的问题。至少对我来说这真的很有挑战性。如何动态设置最佳计时器间隔?

这是一个场景:我有一些工作(让我们说他们中的很多人)。其中一些应该以小秒数间隔执行,其中一些间隔可以是几小时。我把这些工作列入清单。

现在,我使用一个计时器来安排它们。但是,让我们说,我有4个职位:

  • JOB1 - 每5秒
  • 作业2 - 每8秒
  • 作业3 - 每23秒
  • 作业4 - 每10小时。

现在,我应该将计时器设置为最多5秒,以便它可以按照指定执行job1。但是8秒钟的job2每10秒执行一次。当然......我可以选择2秒钟之类的东西......但是现在......每当计时器超过时间间隔时都会检查job4,这会导致性能泄漏(正如我所说的,我有很多这样的工作如此大名单)。

所以我在想,也许我可以使用多个计时器,并将他们的执行间隔分配到一些工作桶中,这听起来像是最好的选择......我只需要一个聪明的想法,这个。

这是我的问题...有什么建议吗?

+3

您需要将您的一些问题标记为已回答(如果他们提供了答案),以便您继续在此处获得优秀答案 – wal 2012-02-09 06:28:44

+0

我会使用System.Threading.Tasks中的任务,每个任务都有自己的计时器对象(.NET有更多类型的计时器,这里我会使用System.Threading.Timer)。 – gsscoder 2012-05-31 15:26:45

回答

0

我会创建一个计时器,只检查是否需要启动一个作业,并给该计时器一秒的时间间隔。它所做的只是检查是否应该开始作业:将作业传递给要执行的线程或线程池。

由于多余的检查可能会失去一些性能,并且如果作业列表很长并且间隔时间很长,则可能会切换到其他设置:为下一个作业必须启动时和传递后设置一个计时器作业到线程(池)计算间隔,直到下一个作业应该启动并调整/设置计时器。当你这样做时,请记住,当你添加/删除/更新作业时,你将不得不检查计时器是否需要调整。

0

您原本有正确的想法:运行一个计时器并记录每个事件的经过时间间隔。创建只有一个定时器比多个定时器更受欢迎。

当你谈论1到5秒的差异时,你在问题中提出的担忧并不重要。无论如何,Windows定时器根本没有那么精确的分辨率。

0

如果您只有几项工作,则可以使用包含作业下一次运行时间的简单List<Job>。让计时器每秒打一次,检查需要运行的作业列表并运行它们。作业完成后,它会更新下一次运行时间。

如果您有很多作业,请创建一个优先级队列,以便在下一次运行时对作业进行排序。然后,您每秒一次的勾号就可以检查队列中的第一个项目。如果需要运行,则将其出列,开始运行,然后检查队列中的下一个项目。使用优先级队列将减少您的每秒一次定时器必须执行的工作量。当然,当作业完成时您需要通知,以便处理程序可以更新下一次运行时间并重新排列作业。