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



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

这是一个场景:我有一些工作(比如说很多)。其中一些应该以少量秒的间隔执行,而另一些则以数小时的间隔执行。我把这些工作列在清单上。

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

  • job1-每5秒
  • job2-每8秒
  • job3-每23秒
  • job4-每10小时一次

现在,我应该将计时器设置为最多5秒,这样它就可以按指定执行job1。但是有8秒的job2将每10秒执行一次。当然我可以选择2秒左右。。。但是现在。。。每次计时器经过该时间间隔时,都会检查job4,这会导致性能泄漏(正如我所说,我有很多这样的作业,所以列表很大)。

所以我在想,也许我可以使用多个计时器,并将作业按顺序分组,考虑到它们的执行间隔,分成一些作业桶。。。这听起来是最好的选择。。。我只需要一个聪明的主意如何做到这一点。

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

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

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

您最初的想法是正确的:运行一个计时器并跟踪每个事件的运行间隔。只创建一个计时器比创建多个计时器更可取。

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

如果只有几个作业,则可以使用包含作业下一次运行时间的简单List<Job>。让计时器每秒勾选一次,检查列表中需要运行的作业,然后运行它们。作业完成后,将更新其下一次运行时间。

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

最新更新