2010-02-16 69 views
4

我需要实现一个执行数据库导入的windows服务,并且每月一次。 该程序通过电子邮件接收数据,并将在每个月底导入它们。如何建立一个非常低分辨率的计时器?

有没有更好的方法比设置程序重复睡眠max_integer秒/毫秒?

+1

它是否会创建一个每月醒来一次的服务?创建一个程序并安排它每月运行它不是更好吗?例如,您可以使用Windows内置调度程序或nnCron(http://www.nncron.ru/)执行此任务。 – 2010-02-16 13:43:12

+1

我在Windows XP,Vista和Windows 7中使用计划任务获得了很好的结果。 – 2010-02-16 13:55:03

回答

16

我不会这样做的Windows服务。我会将其作为计划任务运行。

您的服务只会睡一个月,只是浪费资源。让操作系统跟踪时间并开始执行每月一次的应用程序处理。

4

如果你可以避免写一个窗口服务,你会让你的生活更轻松 - 在这里计划任务可能是一个更好的选择。 Windows服务最适用于需要发生一些不断后台活动的情况 - 而不是长时间运行任务。

但是,如果您必须将此服务设为Windows服务,那么您不需要设置长时间休眠超时值这绝对是一个有问题的方法。如果您的应用程序重新启动会发生什么?它将如何知道它已经睡了多久?或者如果线程重新启动呢?

一个更好的方法是在数据库的某个地方编写一个记录,以确定下一次导入应该作为日期/时间发生。您可以定期(每隔几分钟或几小时)唤醒Windows服务,并查看当前日期/时间是否大于该值。如果是,请运行导入并将数据库中的下一个运行日期更新为下一次运行日期。

如果您的应用程序已重新启动,您只需从数据库中读取值并继续。

+0

如果您的应用程序重新启动,会发生什么情况? 它从注册表中读取最后一次检查日期时间, ,如果从nowtime到registrytime的delta增量> interval,则执行检查,如果 2010-02-16 13:49:57

+0

@ user155077:你当然可以做你正在描述的内容,但是这里存在风险。我会选择使用数据库作为此信息的存储位置,而不是注册表。如果发生灾难性的服务器故障并且您必须重新构建机器,会发生什么情况?您很可能会在注册表中丢失该信息。这是一个遥远的可能性 - 但我看到它发生。不幸的是,系统注册表很少被备份。 – LBushkin 2010-02-16 13:53:22

+0

还值得一提的是,根据环境的不同,windows服务可能无法写入注册表。最好将它放在一个地方,例如数据库。 – 2011-02-02 12:39:45