【问题标题】:C# Windows Service Intermittent Method CallC# Windows 服务间歇方法调用
【发布时间】:2010-04-16 15:39:25
【问题描述】:
场景
我有一个 C# Windows 服务,它基本上订阅了一些事件,如果事件触发了任何事情,它会执行一些任务。
那个东西……
....这些事件是监控过程,我需要在一天中的某些时间重新启动。
问题
在准确的时间执行这项任务的最佳方式是什么?
目前的想法是:
1) 使用计时器每隔几分钟检查一次时间。
2) 不是计时器,也不是很糟糕的实现。
非常感谢您的帮助。
【问题讨论】:
标签:
c#
windows-services
timer
【解决方案1】:
在服务开始时使用 IsBackground = true 启动一个新线程。这可以确保您的线程在您的服务停止时终止,因此您可以简单地启动并忘记它。
在线程中,使用 Thread.Sleep(60*1000) 的无限循环,等待一天中正确的时间重新启动。重新启动可能应该在一个新线程上完成,并且 IsBackground = false 以防止您的服务在您的应用程序完成重新启动之前停止(Windows 允许您关闭服务的时间限制为 30 秒左右)。或者,您可以为重新启动操作生成一个单独的进程。
【解决方案2】:
您可以设置在一天中特定时间运行的计时器,但我可能更喜欢以下方法。
while (!closing)
{
if (SomethingNeedsDoingNow()) { DoIt(); }
Thread.Sleep(1);
}
这几乎不会消耗任何资源,然后可以在一天中的任何时间轻松触发事件,达到 1 秒的粒度。
注意SomethingNeedsDoingNow 应该检查当前时间,看看是否有任何事件需要触发。如果你能以更宽松的粒度逃脱,那么你可以睡 60 秒。
【解决方案3】:
如果您真的想避免实现计时器,一个选项是 Windows 计划任务,它会在触发时终止您的已处理任务。
然后您可以让您的服务不断轮询以确保进程正在运行,如果没有启动它们。
仍然是一种“计时器-y”,但这是另一种方法。