每小时运行的Windows服务

6

我能够构建一个Windows服务并安装它。

我很好奇如何每小时运行这个服务?我希望它能定期每小时运行。

我还需要知道它运行的时间范围,以便我可以将其存储在某个地方。

我该怎么做呢?

编辑:这个服务将被安装在许多机器上,因此,我不想在100台服务器上创建一个计划任务。

7个回答

12
如果想要任务在固定的时间间隔内运行而非一直运行,你应该考虑使用任务计划程序(Task Scheduler)
如果您需要将代码作为服务运行,但需要每小时“激活”一次,则最简单的方法是将您的服务制作成COM对象,并安排一个简单的定时任务来调用一个jscript/vbscript,以创建您的COM对象并调用其中的一个简单方法。另外一种方法是使用任何等待API来“浪费”一个小时的时间而不消耗CPU。
请注意,您还必须考虑一些有趣的设计决策,这取决于您的情境:
- 如果服务崩溃或被用户停止,如何启动您的服务? - 如果您在一个小时以上后启动,是否应再次运行或者需要等待精确的每小时计划? - 如果时区或夏令时在您处于非活动状态时发生了变化,如何跟踪上一次“激活”时间? - 您的服务是否可以防止计算机在空闲时进入睡眠/休眠状态?如果不能,您是否需要在每个小时唤醒计算机,以便按照计划工作?
其中一些问题已由任务计划程序解决,因此我强烈建议您使用任务计划程序而不是在代码中等待一个小时。

等待API会浪费CPU周期吗?您能详细说明一下吗?等待只是系统引发的事件,我认为它并不会轮询任何内容。 - Akash Kava
我不确定你是否正确理解了我的意思。我想说的是,等待API被优化为在等待时间段过去时不使用CPU周期。 - Franci Penov

3
您可以创建一个定时任务,每小时运行一次,以运行服务或发送“唤醒”消息。然后,在计划任务请求中传递当前时间,或者在程序唤醒时获取当前时间即可。您可以使用任务计划程序托管包来进行编程设置,也可以通过谷歌搜索其他资源。请参考链接:http://support.microsoft.com/kb/308569http://taskscheduler.codeplex.com/

但我想要能够在代码中实现它。想象一下这个服务将被安装在许多服务器上,我不想去每台服务器上创建一个计划任务。 - DarthVader
1
@user177883:您可以像创建服务程序一样,通过编程方式创建定时任务。 - Billy ONeal

3

有几个选项可以考虑。

  1. 您可以睡一小时。
  2. 您可能更适合使用计划任务而不是服务。

2
Thread.Sleep(1000*60*60);

2
如果您在服务睡眠一小时时尝试停止该服务会发生什么? - Phil Gan
@PhilGan的解决方案是sleep和stop的区别 - PreguntonCojoneroCabrón

2
Thread.Sleep(TimeSpan.FromHours(1));

通过这种方式使代码更易读


2

Thread.Sleep() 方法会确保您的服务在一个小时的时间间隔内运行,而不是每个小时运行一次,即每个任务将在 1 小时 + 任务运行时间后启动。考虑在服务中使用计时器。这将是一个更加健壮的解决方案,因为您可以控制何时运行任务,监视其进度等等。请记住,每个 Timer 事件都会在不同的线程中触发,如果任务运行时间超过一个小时,您可能需要等待第一个任务完成以避免并发任务。


0

任务调度器可能是个好主意,但服务是专门为此设计的。服务易于安装并正确记录日志。你所需要做的就是,在服务启动时,可以安装一个系统计时器(System.Threading.Timer),或者还有另外一种计时器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接