2010-04-07 80 views
6

我可以构建一个Windows服务并进行安装。每小时运行一次的Windows服务

我很好奇我怎么能每小时运行一次这项服务?我希望它定期每小时运行一次。

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

我该怎么做?

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

回答

12

如果你想有一个任务在定期运行,而不是不断,你应该考虑使用Task Scheduler

如果你需要你的代码是一个服务,但要每小时“激活”,最简单的方法是使你的服务成为一个COM对象,并且每小时调度一个简单的任务,调用一个jscript/vbscript创建你的COM对象并调用简单的方法。

另一种方法是使用任何等待API“浪费”一小时而不消耗周期。

请注意,还必须考虑到,依赖于你的情况下一些有趣的设计决策是:

  • 是怎么回事,如果它崩溃来启动你的服务或由用户停止?
  • 如果您在一个多小时后启动,是否应该再次运行,还是需要等待确切的小时计划?
  • 如果时区或日光节约时间在您未处于活动状态时发生变化,您将如何跟踪上次“激活”时间?
  • 您的服务是否阻止计算机在怠速或笔记本电脑保护盖关闭时进入睡眠/休眠状态?如果没有,您是否需要在一小时内唤醒计算机以使您的服务按照您的时间表工作?

其中有些是由任务调度程序照顾的,所以我强烈建议在路由中等待一小时的代码。

+0

等待API浪费CPU周期?你能详细解释一下吗?等待只是系统引发的事件,我不认为它在轮询任何事情。 – 2011-11-07 07:25:49

+0

我不确定你是否正确理解我。我试图说,等待一段时间过后,等待的API优化为不使用CPU周期。 – 2011-11-07 21:56:56

3

您可以创建一个每小时运行一次的scheduled task,以运行该服务或发送消息以“唤醒”。然后,无论是在当前时间传递计划的任务请求,还是让您的程序在唤醒时获取当前时间。

Task Scheduler Managed Wrapper可以帮助您以编程方式进行设置;你也可以谷歌的其他资源。

+0

但我想能够在代码中实现。想象这个服务将被安装在许多服务器上,我不想去每个服务器并创建一个计划任务。 – DarthVader 2010-04-07 02:46:00

+1

@ user177883:您可以以编程方式创建计划任务,就像您可以以编程方式创建服务一样。 – 2010-04-07 02:49:42

3

有几个选项。

  1. 你可以睡一个小时。
  2. 您可能更适合预定任务,而不是服务。
2
Thread.Sleep(1000*60*60); 
+2

如果您尝试在睡眠一小时时停止服务,会发生什么情况? – 2010-04-08 08:37:47

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

代码更易读这样

2

Thread.Sleep()解决方案将确保您的服务将在一个小时的时间间隔运行,而不是每隔一小时即每个任务将1小时的时间+运行任务开始。考虑在您的服务中使用Timer。这将是一个更强大的解决方案,因为您可以控制何时运行任务,监视其进度等。请记住,每个Timer事件将在不同的线程中触发,如果任务花费的时间超过一个小时,您可能会等待第一个任务完成以避免并发任务。

0

任务调度程序可能是一个好主意,但服务旨在执行此操作。服务易于安装并正确记录事情。您只需要在服务开始时安装一个系统计时器(System.Threading.Timer),或者还有一个计时器。

相关问题