每小时运行一次的Windows服务

时间:2010-04-07 02:43:38

标签: c# .net windows-services cron

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

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

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

我该怎么做?

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

7 个答案:

答案 0 :(得分:12)

如果您希望任务定期运行而不是经常运行,您应该考虑使用Task Scheduler

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

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

请注意,您还必须考虑一些有趣的设计决策,这些决策取决于您的方案:

  • 如果服务崩溃或被用户停止,您的服务将如何启动?
  • 如果您在超过一小时后开始工作,您是否应该再次开始运行,或者您是否需要等待达到确切的每小时时间表?
  • 如果在您不活动时时区或日光节约时间发生变化,您如何跟踪上次“激活”时间?
  • 您的服务是否阻止计算机在空转或笔记本电脑盖关闭时进入休眠/休眠状态?如果没有,您是否需要按小时唤醒计算机以使您的服务按计划运行?

其中一些由任务调度程序处理,因此我强烈建议您使用该路由而不是在代码中等待一小时。

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

有几种选择。

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

答案 3 :(得分:2)

Thread.Sleep(1000*60*60);

答案 4 :(得分:2)

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

代码更具可读性

答案 5 :(得分:2)

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

答案 6 :(得分:0)

任务调度程序可能是一个好主意,但服务旨在实现此目的。服务很容易安装并正确记录。您需要做的就是,在服务开始时,您可以安装系统计时器(System.Threading.Timer)或者还有一个计时器。