【问题标题】:Windows Service or Task Scheduler for maintenance tasks?用于维护任务的 Windows 服务或任务计划程序?
【发布时间】:2010-10-03 15:56:24
【问题描述】:

我有一个执行一些维护任务的 C# 应用程序。它需要大约每小时运行一次,尽管如果它有点偏离也不是很重要。它必须在没有人登录的 Win2003 服务器上运行。

基本上我想知道我是否应该编写一个 Windows 服务,如果是的话,如果 Thread.Sleep() 是暂停线程一小时的正确方法,或者是否有更好的方法来确保线程保持空闲并且不把任何服务器负载? (又名。与自旋​​锁最相反的是什么)

替代方案是 Windows 任务计划程序,但我不确定这是否适合服务器使用,因为 a) 我必须将计划存储在其中而不是在我的 app.config 中,b) 我无法轻松控制通过启动/停止/重新启动服务和 c) 我不知道 Windows 用户的凭据是否像我在服务 MMC 管理单元中输入它时一样安全。

你有什么看法?有一个空闲的服务是可能的还是很好的,或者你会推荐任务调度程序吗?

【问题讨论】:

    标签: windows-services windows-server-2003


    【解决方案1】:

    您可能会觉得这个video 很有趣。对负责 Windows 服务的工程师进行了很好的采访,还谈到了何时选择服务或任务。简而言之,如果您的功能属于定期维护类别,请执行一项任务。

    【讨论】:

      【解决方案2】:

      我自己更喜欢任务计划程序,因为如果需要,它更易于维护和更改计划。

      此外,如果开发人员“忘记”执行诸如关闭连接、文件等会随着时间的推移而累积的操作,那么连续运行和“休眠”的实用程序可能会引发问题。让程序“运行并退出”是一个额外的安全毯。 :-)

      【讨论】:

        【解决方案3】:

        Windows 服务更安全:没有人可以丢弃它并且永远有效。我发现 Windows 任务有很多问题(不执行,...)。

        Windows 任务计划程序用于最终用户任务而不是应用程序任务。无论如何,Windows 备份使用它;-)

        【讨论】:

          【解决方案4】:

          如果您选择服务路线,那么我建议您使用 System.Threading.Timer。有了它,您可以将其设置为每小时触发一次事件。如果您认为需要更改间隔,可以将间隔放在 app.config 中。

          服务也在本地系统帐户下运行(默认情况下),而在使用计划任务时您必须提供用户名/密码。如果您使用您的用户名,如果您更改密码并忘记更新任务,则会成为维护问题。

          我有一种情况,我实际上将两者结合使用。该服务在白天持续运行,但他们每晚都会进行网络和数据库维护。所以,我使用两个计划任务。一个在午夜关闭服务,一个在凌晨 4 点重新打开。这是通过使用 NET STOP/NET START 命令调用 .BAT 文件来完成的。

          【讨论】:

            【解决方案5】:

            我认为 Windows 服务可能更可靠且更易于监控,但它不会提供与开箱即用的计划任务相同的计划灵活性。无论如何,我可能会使用该服务,因为大多数企业应用程序倾向于作为服务运行,而不是计划任务。

            对于最近的项目,我使用Quartz.NET 在 Windows 服务中设置计划处理。实际上设置起来并不难(很好的教程),而且 CronTrigger 只需一点点配置就可以为您提供很大的灵活性。比起原始的 .NET 计时器,我更喜欢它。

            【讨论】:

              【解决方案6】:

              我想投入我的 5 美分,当你的任务没有运行时,使用任务调度器会节省一些内存。

              【讨论】:

                最近更新 更多