如何动态设置最佳定时器间隔?

时间:2012-02-09 06:23:34

标签: .net timer

我知道我总能找到很好的答案,所以我有一个新的挑战性问题。至少对我来说这真的很有挑战性。

这就是场景:我有一些工作(让我们说很多)。其中一些应该以少量的秒间隔执行,其中一些可以按小时间隔执行。我把这些工作放在一个清单中。

现在,我使用计时器来安排它们。但是,假设我有4个工作岗位:

  • job1 - 每5秒
  • job2 - 每8秒
  • job3 - 每23秒
  • job4 - 每10个小时。

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

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

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

3 个答案:

答案 0 :(得分:0)

我创建了一个单独的计时器,它只检查是否需要启动作业,并为该计时器提供一秒钟的间隔。它只是检查以及是否应该启动作业:将作业传递给要执行的线程或线程池。

由于多余的检查,您可能会失去一些性能,如果作业列表很长且间隔非常大,您可能会切换到不同的设置:为必须启动下一个作业的时间和通过后设置计时器作业到线程(池)计算间隔,直到下一个作业应该开始并调整/设置计时器。执行此操作时,请记住,在添加/删除/更新作业时,您必须检查计时器是否需要调整。

答案 1 :(得分:0)

您最初有正确的想法:运行单个计时器并跟踪每个事件的已用间隔。仅创建一个计时器优先于多个计时器。

当你谈论1至5秒之间的差异时,你在问题中提出的问题并不重要。 Windows计时器无论如何都没有那么精确的分辨率。

答案 2 :(得分:0)

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

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