【问题标题】:How can I dynamically set the best timer interval?如何动态设置最佳计时器间隔?
【发布时间】:2012-03-01 15:45:06
【问题描述】:

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

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

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

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

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

所以我在想,也许我可以使用多个计时器,并考虑到它们的执行间隔将作业动态地分组到一些作业桶中……这听起来是最好的选择……我只需要一个聪明的想法来解决这个问题.

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

【问题讨论】:

  • 您需要将一些问题标记为已回答(如果他们为您提供了答案),以便您继续在此处获得出色的答案
  • 我会使用 System.Threading.Tasks 中的任务,每个任务都有自己的计时器对象(.NET 有更多种类的计时器,这里我会使用 System.Threading.Timer)。

标签: .net timer


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您最初的想法是正确的:运行一个计时器并跟踪每个事件的经过时间间隔。只创建一个计时器优于多个计时器。

    当您谈论 1 到 5 秒之间的差异时,您在问题中提出的问题并不重要。 Windows 计时器根本就没有那么精确的分辨率。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-01-12
        • 1970-01-01
        • 2021-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多