【问题标题】:Running timed job运行定时作业
【发布时间】:2011-05-30 00:39:09
【问题描述】:

假设我有一个带有表的数据库,该表中的每条记录都对应一个要执行的操作。该表有一个日期时间字段,其中存储了下一次应该执行的动作。

Windows 服务正在读取此表,并且操作存储在数据结构中。服务每隔几分钟读取一次表,并将新的操作合并到数据结构中,因此不会错过同时创建的操作。

每个动作都有一定的重复间隔。当动作运行时,日期时间字段将更新到它的下一个时刻 应该基于该间隔运行。

现在我想知道正确的行动方案:实际开始行动的首选方式是什么 它的给定时间?

假设我有一个动作应该在 09:00 在数据结构中运行,我如何确保它在 09:00 触发? 我目前想到的是每分钟检查一次数据结构,将当前时间与计划的动作时间进行比较,如果它们匹配,则执行动作并根据其关联的时间间隔更新动作的执行时间。

作为一种数据结构,我倾向于排在队列中,所以我可以在前面处理下一个作业,我只需要检查第一个作业,但是每次发现新动作时我都需要重新排列队列。

我的主要兴趣点是检查是否应执行操作的好方法,然后将遵循适当的数据结构。表中的操作数量会非常少,不会超过 25 个。我无法控制数据库,所以一切都应该在 C# 中以编程方式完成,以防您想知道。 有什么建议、经验或建议吗?

【问题讨论】:

  • 您需要数据库吗?谁启动计划任务?
  • 取决于系统;在数据库(或类似数据库)中,您可以保存系统状态以防系统崩溃。
  • 是的,需要一个数据库作为添加新操作等的中心点。当然,这只是系统的一小部分。唯一要讨论的应该是检查时间的方式。

标签: c# scheduled-tasks


【解决方案1】:

SQL 代理似乎是一个不错的选择,但您不会收到有关客户端应用程序的反馈。

【讨论】:

    【解决方案2】:

    假设粒度为 1 分钟。我会让一个线程经常轮询数据库并更新要在下一分钟开始的事情列表。然后,一个单独的计时器线程可以随着时间的流逝而启动该操作列表。

    当您深入了解细节时,它会变得更加复杂,因为您可能还想严格控制与其关联的状态机(准备、运行、完成等)。

    【讨论】:

    • 这就是我的想法,想知道这是否是首选方式。
    • 嗯,这是一种方式,如果你的服务水平很紧(你需要立即开始),它会比简单的答案更好,即轮询和踢关闭应该在最后一分钟开始的事情。它还有助于在一定程度上使您免受扩展问题的影响——轮询 很多 状态信息来确定要运行的内容可能会导致您错过启动任务。有很多皱纹,这实际上取决于您要保证的服务。
    • 好的,经过一番思考,我会这样做:)
    【解决方案3】:

    如果您有一个计时器实例作为数据结构的一部分,并安排它在此操作到期时运行一次。这样您就不必检查,并且只要将结构放入队列或列表中,您就知道它已计划运行。计时器将在单独的线程上触发,因此您的代码将与与数据库对话的部分异步运行...

    【讨论】:

    • 这是否意味着每个任务都需要一个线程?或者如果事件数据是正确的时间,它会订阅特定的计时事件并自行启动吗?例如您有一个计时器线程每分钟或多长时间发送一次计时事件,并且任务注册以接收这些事件。
    【解决方案4】:

    使用现有的解决方案...

    http://quartznet.sourceforge.net/

    【讨论】:

    • 我愿意,但不能/不允许。
    • @Oxymoron:我会在这里争取例外。使用现有的解决方案,您只需要构建一个适配器来链接您已有的数据存储和调度程序。
    猜你喜欢
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    • 2011-08-29
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多