【问题标题】:How to build a very-low resolution timer?如何构建一个非常低分辨率的计时器?
【发布时间】:2010-02-16 13:39:04
【问题描述】:

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

有没有比让程序重复休眠 max_integer 秒/毫秒更好的方法?

【问题讨论】:

  • 创建一个每月唤醒一次的服务有意义吗?创建一个程序并安排它每月运行不是更好吗?例如,您可以为此任务使用 Windows 内置调度程序或 nnCron (nncron.ru)。
  • 我在 Windows XP、Vista 和 Windows 7 中使用计划任务取得了不错的效果。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果您可以避免编写窗口服务,那么您的生活会更轻松 - 计划任务在这里可能是更好的选择。 Windows 服务最适合用于有一些持续的后台活动的事情这需要发生 - 不是为了长时间运行任务。

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

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

    如果您的应用重新启动,您只需从数据库中读取值并像以前一样继续。

    【讨论】:

    • 如果您的应用程序重新启动会发生什么?它从注册表中读取最后一次检查日期时间,如果从 nowtime 到 registrytime 的 delta 大于 > 间隔,则执行检查,如果
    • @user155077:您当然可以按照您的描述进行操作,但存在相关风险。我会选择使用数据库作为这些信息的存储位置,而不是注册表。如果发生灾难性的服务器故障并且您必须重建机器会发生什么?您很有可能会在注册表中丢失该信息。这是一个遥远的可能性 - 但我已经看到它发生了。不幸的是,系统注册表很少被备份。
    • 另外值得一提的是,视环境而定,windows服务可能无法写入注册表。最好将其全部保存在一个地方,例如数据库。
    猜你喜欢
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多