在特定时间从数据库执行事件的最佳方法

时间:2014-03-14 16:41:09

标签: c# algorithm scheduled-tasks

我的数据库中有一个名为提醒的表。所以一行可能看起来像

Id    Subject     Time
 1     "Foo"      2014-14-03 13:30:00

然后我想发送一封关于2014-14-03 13:30:00的电子邮件。这样做的最佳方法是什么?我能想到的唯一解决方案是每分钟查询一次数据库,看看我需要发送哪些电子邮件。现在我需要一个Windows服务和我的网站,因为Windows服务需要不断运行。我认为可能有更好的解决方案。

4 个答案:

答案 0 :(得分:2)

您可以使用Quartz.NET等库,并在服务启动时定期阅读您的表格。

答案 1 :(得分:1)

我可以像Queue一样思考。只是一个想法。好吧,不仅是一个队列,就像一个队列和一个堆叠在一起,由你创建的东西。

这样,如果您添加时间少于第一个任务的新任务,则可以将此任务放在第一个位置。

您可以创建一个队列/堆栈,然后将一个新元素排入队列,并启动一个Timer(或一个计数器),它具有现在的时间和包含的任务的时间之间的差异。这样您只需要检查其中一个任务。

然后,当现在的时间等于队列中的第一个任务时,将此任务出列队列,并对新任务执行相同的操作。如果Queue为空,则不需要对数据库执行任何操作,只检查第一个任务中的时间。

我希望这会有所帮助。

答案 2 :(得分:0)

我会使用NServiceBus,并且有一个循环传奇,它从数据库读取并将本地消息发送回总线,用于发生需要发生的每件事,例如发送电子邮件' '运行此脚本'然后为每种消息类型处理程序。在这里查看第110行,这是它循环的方式:

https://github.com/escherrer/EC2Utilities/blob/master/EC2Utilities.ServiceBus/Sagas/StartServerSaga.cs

我能想到的其他方式是:

  1. Quartz.NET(如schglurps提及)
  2. 如果你想避免安装服务,那么使用Windows调度程序安排一个exe来运行每分钟左右并执行它需要做的事情。
  3. 如果你刚刚开始我推荐这种方法,请完全自己动手。
  4. HTH, 埃里克

答案 3 :(得分:0)

您只需要经常查询数据库即可。如果您从未插入请求在下一小时内运行新任务的行,那么您可以每小时检查一次服务查询,查看下一小时内要运行的任务列表,并将结果缓存到内存中。

如果您不断添加需要立即或很快运行的新任务,则必须经常查询数据库。

或者,如果允许在SQL Server主机上运行程序,则可以编写执行INSERT的存储过程然后执行程序(执行任务或通知远程主机执行任务)使用xp_cmdshell命令:

http://technet.microsoft.com/en-us/library/ms175046.aspx