预定的控制台应用程序与Windows服务?什么时候适合使用它们

时间:2009-02-03 15:53:59

标签: .net windows windows-services

我刚读过这个:What is the benefit of developing the application as a windows service?但我仍然不确定何时使用Windows服务。

我有几个任务需要每隔一段时间(即每5分钟)运行一次。我应该使用哪种项目类型?是否有应该是Windows服务的应用程序类型的示例?

8 个答案:

答案 0 :(得分:27)

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

  • 即使用户未登录到PC,Windows服务也会运行(即使服务器处于登录提示位置也会运行)(***注意 - 这可能取决于您运行的Windows版本)
  • 服务可以作为网络服务或本地系统等高权限帐户或用户运行 - 它们在这方面具有更多可配置性
  • 服务还内置了运行时启动,停止,重启和暂停的选项(有时)
  • 您还可以为服务设置故障条件,例如,如果它失败,则自动重启

对于可以作为Windows服务的应用程序的其他示例,很多时候它们对远程处理等应用程序很有用 - 您可以让服务运行客户端连接到的远程服务器。对于您希望在后台运行的数据处理任务,或者您希望在某些条件下发送电子邮件的流程等,显然非常有用。

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

参考Timer的错误 - 如果您在MS的网站上阅读了错误报告,您可以看到它是在Timer_Elapsed事件中调用“Stop”时引起的。答案很简单 - 不要叫停。相反,将整个事物包装在一个“IsRunning”布尔值的检查中,并且仅在IsRunning为false时才运行。即使计时器没有问题,您仍然需要这样做,因为如果执行时间超过计时器间隔,计时器可能会在执行期间重新启动。

无论如何,我仍然认为使用预定任务是一个弱解决方案,并给我回忆Windows 95。

答案 1 :(得分:25)

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

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

计划任务可以在任何帐户下运行,也不需要像服务一样登录用户。对于单一目的任务,例如您建议的外部控制任务通常是无关紧要的,因此您不需要服务的可控性。

一个重要因素是Task Scheduler是一个非常强大且灵活的基于事件的调度程序。您最不可能编写一个更强大的调度程序,可以处理时间变化和基于触发器的调度。事实上,有很多关于在本网站上使用计时器来安排服务任务的问题,而且质量差或完全不正确的答案数量(包括一些“正确的”答案)非常值得。

编辑:值得注意的是,微软的政策正在转向使用基于任务的操作的服务。如果你检查Vista,Win2K8和Win7,你会发现越来越多的特殊用途计划任务执行系统维护和许多系统服务。

答案 2 :(得分:3)

不得不进行编写​​,调试,部署和支持两者,我更喜欢远程调度任务。我不怀疑有用例,这是错误的选择。但是对于任何相对简单的任务,作为计划任务运行的控制台应用程序运行良好。

根据我的经验,预定任务非常可靠。我不记得一次失败,我支持从日常到每15分钟运行的六个不同的计划任务。 (并不是说没有失败,但它们都是代码或配置问题。并且已经记录并发送了通知。问题始终存在于任务调度基础架构中。)

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

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

如果我再次开发Windows服务,我会将其作为控制台应用程序编写,然后找到一种方法将其包装到服务中,使调试不那么令人头疼。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

我有许多Windows计划任务,每小时在生产Web服务器上运行。它们根本不可靠。它们在特定计算机帐户下的Windows 2003 Server中运行。大部分时间它们都能很好地工作,但有时它们无法运行,有时它们会在完成之前终止。

其中一些原因可能是它们是vbscripts以及它们的编写方式,但我看到WS FTP Pro(商业FTP软件)的计划任务行为方式相同。

我已将其中许多转换为Windows服务,并且再也不用担心它们了。

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

答案 5 :(得分:1)

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

计划任务与服务的停止和重新启动命令具有相同的操作,即。禁用任务,启用任务。简单,它允许任何当前正在进行的操作完成,而不是试图中止它们,这本身就是正确的方式来处理它。手动执行所有这些状态/转换管理资源生命周期只是在存在重构时容易出错。

答案 6 :(得分:1)

我从我的经验告诉你,大多数时候我更喜欢使用计划任务而不是 Windows 服务的主要原因之一是它更容易调试,当然最重要的是列表是 memory management 中的 scheduled tasks

Windows servicealways running processschedule task 在实际需要时运行,例如,假设您要处理应用程序中的大量数据,并且应该每小时触发一次,如果您使用 Windows 服务,那么您应该正确使用 disposing objectsreleasing memory blocks,否则可能会是一个巨大的麻烦,但是在您的操作完成后的计划任务中,您的流程被处理掉了,没有留下任何东西。

答案 7 :(得分:0)

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

使用Windows服务(不停止服务)时,进程永远不会消失。并且您必须在程序中确保释放资源。