运行定时工作

时间:2010-12-23 15:04:37

标签: c# scheduled-tasks

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

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

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

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

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

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

我的主要兴趣点是检查是否应该执行某个操作,然后是一个合适的数据结构的好方法。表中的操作量将非常低,不超过25.我无法控制数据库,所以一切都应该在C#中以编程方式完成,以防您想知道。 任何提示,经验或建议点?

4 个答案:

答案 0 :(得分:1)

说粒度是1分钟。我经常有一个线程轮询数据库,并在下一分钟更新要启动的事项列表。然后,一个单独的计时器线程可以在分钟结束时启动该操作列表。

当你进入细节时,它会变得有点复杂,因为你可能希望在与它相关的状态机上保持紧密控制(准备,运行,完成等)。

答案 1 :(得分:1)

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

http://quartznet.sourceforge.net/

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果您将计时器实例作为数据结构的一部分,并在此操作到期时安排它运行一次,该怎么办?通过这种方式,您无需检查,只要将结构放入队列或列表中,就会知道它已安排运行。计时器将在一个单独的线程上触发,因此您的代码将与与数据库通信的部分异步运行...