如何构建一个非常低分辨率的计时器?

时间:2010-02-16 13:39:05

标签: c# .net vb.net timer scheduled-tasks

我需要实现一个执行数据库导入的Windows服务,每月一次。 该程序通过电子邮件接收数据,并将在每个月末导入它们。

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

2 个答案:

答案 0 :(得分:16)

我不会像Windows服务那样做。我会将它作为计划任务运行。

您的服务将只睡一个月,只是浪费资源。让操作系统跟踪时间并启动您的应用程序,以便每月处理一次。

答案 1 :(得分:4)

如果您可以避免编写窗口服务,那么您的生活将更轻松 - 计划任务可能是更好的选择。 Windows服务最适用于存在持续背景活动的事物这需要发生 - 而不是长时间运行任务。

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

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

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