我有一个执行一些维护任务的C#应用程序。它需要大约每小时运行一次,但如果它有点偏差则不太重要。它必须在没有用户登录的Win2003服务器上运行。
基本上我想知道我是否应该编写Windows服务,如果是的话,如果Thread.Sleep()是一种暂停线程一小时的正确方法,或者是否有更好的方法来确保线程保持空闲状态没有任何服务器负载? (又名。与Spinlock最相反的是什么)
替代方案是Windows任务计划程序,但我不确定这是否适合服务器使用,因为a)我必须将计划存储在其中,而不是存储在我的app.config中,b)我无法轻易控制通过启动/停止/重启的服务和c)我不知道Windows用户的凭据是否与我在Service MMC Snapin中输入时一样安全。
你有什么看法?拥有空闲服务是否可能有用,或者您是否建议使用任务调度程序?
答案 0 :(得分:7)
您可能会发现此video很有趣。对负责Windows服务的工程师的良好采访,以及何时选择服务或任务。简而言之,如果您的功能属于定期维护类别,请执行任务。
答案 1 :(得分:5)
我自己更喜欢任务计划程序,因为如果需要,更容易维护和更改计划。
此外,如果开发人员“忘记”执行诸如关闭连接,文件等可能会随着时间的推移而积累的事情,那么连续运行并“休眠”的实用程序会冒着导致问题的风险。让程序“运行和退出”是一个额外的安全毯。 : - )
答案 2 :(得分:1)
Windows服务更安全:没有人可以放弃它并且永远有效。我发现Windows任务有很多麻烦(没有执行,......)。
Windows任务计划程序适用于最终用户任务,不适用于应用程序任务。无论如何,Windows备份使用它; - )
答案 3 :(得分:1)
如果你去服务路线,那么我建议使用System.Threading.Timer。有了这个,您可以将其设置为每小时触发一次事件。如果你认为你需要更改它,可以将时间间隔放在app.config中。
服务也在本地系统帐户下运行(默认情况下),而在使用计划任务时必须提供用户名/密码。如果您使用用户名,如果您更改密码并忘记更新任务,则会成为维护问题。
我有一种情况,我实际上使用了两者的组合。该服务在白天不断运行,但每晚都进行网络和数据库维护。所以,我使用两个计划任务。一个在午夜关闭服务,一个在凌晨4点将其关闭。这是通过使用NET STOP / NET START命令调用.BAT文件来完成的。
答案 4 :(得分:1)
我认为Windows服务可能更可靠,更容易监控,但它不会提供与开箱即用的计划任务相同的调度灵活性。我可能会继续使用该服务,因为大多数企业应用程序往往是作为服务运行,而不是计划任务。
对于最近的项目,我使用Quartz.NET来设置Windows服务中的预定处理。它实际上并不太难设置(好的教程),而CronTrigger只需要一点点配置就能给你很大的灵活性。我比原始的.NET Timer更喜欢它。
答案 5 :(得分:1)
我想要投入5美分,使用任务调度程序将在您的任务未运行时节省一些内存。