【问题标题】:Windows Service with multiple timers具有多个计时器的 Windows 服务
【发布时间】:2011-12-26 04:47:41
【问题描述】:

在我目前的实习期间,我得到了一个由以前的实习生编写的 Windows 服务,该服务可以监控存档并在其中一个记录值超出特定范围时通过电子邮件和弹出窗口提醒特定人员。它目前使用计时器每 30 秒检查一次存档,有人问我是否能够更新它以允许根据正在监视的“标签”选择时间。它使用 XML 文件来跟踪正在监视的标签。在服务中创建多个计时器是解决此问题的最有效方法吗?我不确定要采取什么方法。

该服务是使用 .NET 3.5 用 C# 编写的。

【问题讨论】:

    标签: c# .net .net-3.5 windows-services timer


    【解决方案1】:

    根据粒度,您可以使用单个计时器,该计时器是他们想要的计时间隔的共同因素。假设他们想放入每个档案每隔几分钟检查一次的 XML 文件。您设置了一个每分钟响一次的计时器,然后检查自您完成每个计时器以来的时间以及是否执行。

    如果您有机会重新架构,我会从服务转移到一组计划任务。编写它,以便一项任务完成一个存档。然后编写一个控制器程序来设置计划任务(并可以停止、更改它们等)。Windows 7 上计划任务的 API 很好且易于理解,并且与服务不同,您可以施加诸如“不要这样做”之类的限制如果计算机正在使用电池”或“仅在机器空闲时执行”以及您在错过运行任务的机会时该怎么做的偏好。 7 或 8 个计划任务,每个任务都有自己的时间表,使用与您相同的 API,传入存档路径和电子邮件地址,这比一个服务试图同时处理所有事情要简洁得多。另外,当您没有其他自动启动服务时,机器将启动得更快。

    【讨论】:

    • 我一定会研究计划任务的想法。由于 3 个人对使用单个通用计时器说了同样的话,这似乎是目前最好的方法。谢谢!
    【解决方案2】:

    高效?可能不会 - 特别是如果您有很多标签,因为每个计时器占用的资源很小但数量有限。

    另一种方法可能是设置一个每秒触发一次的计时器,然后在发生这种情况时检查未完成请求的列表。

    这样做的好处是在出现问题时更容易调试,因为只有一个活动线程。

    然而,在大多数代码维护情况下,这取决于您现有的代码、您的能力以及您感觉如何更舒服。

    【讨论】:

      【解决方案3】:

      我建议只使用一个安排在最小公约数上的计时器。

      例如,将您的计时器配置为每秒发出一次信号,您可以通过计算相应的计时器滴答数来处理每个时间间隔(1 秒、2 秒……)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-27
        • 2012-10-04
        相关资源
        最近更新 更多