计划的控制台应用程序与Windows服务? 什么时候适用每个?

我刚刚读到: 作为Windows服务开发应用程序有什么好处? 但我仍然不确定何时使用Windows服务。

我有几个任务需要间隔运行(即每隔5分钟)。 我应该使用哪种types的项目? 是否有任何应该是Windows服务的应用程序的例子?

谢谢,

凯尔

对于任何计划的任务,我通常会推荐一个Windows服务,原因如下:

  • 即使用户没有登录到PC,Windows服务也将运行(即使服务器坐在登录提示符下也会运行)(***注 – 这可能取决于您运行的Windows的版本)。
  • 服务可以像网络服务或本地系统或用户那样作为高权限帐户来运行 – 在这方面他们具有更多的可配置性
  • 服务还内置了启动,停止,重新启动和暂停(有时候)
  • 您也可以为服务设置失败条件,如失败则自动重启

至于可以是Windows服务的应用程序的其他例子,很多时候它们对于远程处理等应用程序是有用的 – 你可以让一个服务运行一个客户端连接的远程服务器。 显然,对于您想要在后台运行的数据处理任务,或者您想在特定条件下发送电子邮件的进程等非常有用。

总的来说,我总是发现计划任务更加脆弱和不可靠。 除非你让他们正确记录,否则往往更难以调试。

参考定时器的错误 – 如果您阅读MS网站上的错误报告,您可以看到,在Timer_Elapsed事件中调用“Stop”时会导致错误。 答案很简单 – 不要叫停止。 而是将整个事件包装在“IsRunning”布尔值的检查中,并且只在IsRunning为false时才运行。 即使计时器没有问题,仍然需要这样做,因为如果执行时间比计时器间隔长,计时器可能会在执行过程中重新启动。

无论如何,我仍然认为使用计划任务是一个薄弱的解决方案,并给我闪回Windows 95。

对于按计划运行的单一或狭义目的应用程序,通过任务计划程序运行控制台应用程序几乎总是正确的设计。

对于长时间运行或需要交互的复杂任务 ,如手动启动,停止,暂停,继续等,一般来说,Windows服务是更好的选择。

计划任务可以在任何帐户下运行,不需要像“服务”一样登录的用户。 对于单一用途的任务,例如你建议的任务的外部控制通常是不相关的,所以你不需要服务的可控性。

Task Scheduler也是一个非常强大和灵活的基于事件的调度器。 你可能写一个更强大的调度程序是非常不可能的,它可以处理变幻莫测的时间和基于触发器的调度。 事实上,在本网站的服务中使用计时器来安排任务有很多问题,而质量差或者完全不正确的答案(包括一些“正确的”答案)的数量是非常惊人的。

编辑:也有趣的是,微软的政策正在转移使用基于任务的服务的行动。 如果您检查Vista,Win2K8和Win7,您将注意到执行系统维护和许多系统服务的特定用途计划任务的列表越来越多。

不得不写,调试,部署和支持,我更喜欢计划任务。 我不怀疑,有这样的用例是错误的选择。 但是对于任何相对简单的任务来说,作为时间表任务运行的控制台应用程序效果很好。

根据我的经验,计划任务是非常可靠的。 我不记得一个单一的失败,我支持大约六十个不同的计划任务,每天运行到每隔15分钟。 (不是说没有失败,而是全部是代码或者配置问题,并且被记录并发送了通知,问题从来没有出现在任务调度基础架构中。

任务计划程序任务可以在任何用户上下文下运行,并且不需要任何人登录。

我最大的优点是部署。 对于控制台应用程序,只需将EXE发布到正确的目标文件夹即可。 对于Windows服务,您需要停止服务(使用net.exe),卸载服务(使用InstallUtil.exe),等待(我有部署睡眠25秒),发布EXE,然后全部反向(安装,开始)。

如果我要再开发一个Windows服务,我会把它写成一个控制台应用程序,然后找到一种方法将其包装到一个服务中,使调试更少的头痛。

这是Windows服务,IMO的典型案例。

我有一个Windows计划的任务在生产Web服务器上每小时运行一些。 他们根本不可靠。 他们在Windows 2003 server中运行特定的计算机帐户。 大多数时候,他们完美的工作,但偶尔他们无法运行,有时他们终止之前,他们完成。

其中一些可能是由于它们是vbscripts和它们的编写方式,但是我已经看到了使用WS FTP Pro(商业FTP软件)的计划任务,其行为方式相同。

我已经将其中很多转换为Windows服务,并再也不用担心。

我肯定会倾向于Windows服务。 就像其他一些评论一样,我被太多的窗口计划任务烧毁了。 我不相信他们的企业级解决方案。

除了需要以非常短的时间间隔运行或者持续运行的程序之外,我会在所有情况下推荐一个计划任务。 启动,执行它们的功能和关闭的程序具有定义良好的资源生命周期,在有限的步骤中执行适当的设置和清理(如果不是,则在预期的时间内不终止的事实表示错误),因此更容易推理。 而且你不需要用定时器等来弄乱。

计划任务对服务的停止和重新启动命令具有等同的操作,即, 禁用任务,启用任务。 简单,它可以让任何正在进行的操作完成,而不是试图中止它们,这本质上是正确的处理方法。 手动执行所有这些状态/转换管理资源生命周期只是在存在重构的情况下容易出错。

在大多数情况下,我更喜欢windows服务。
使用计划任务时一件好事:
所有使用的资源在计划任务完成时释放。

当使用Windows服务(不停止服务),过程不会死亡。 你必须在你的程序中确保资源被释放。