6

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

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

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

你有什么意见?拥有空闲服务是否可能并且很好,或者您会推荐任务调度程序吗?

4

6 回答 6

7

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

于 2009-01-26T23:34:37.223 回答
5

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

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

于 2009-01-26T23:10:32.733 回答
1

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

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

于 2009-01-26T23:07:13.567 回答
1

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

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

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

于 2009-01-26T23:14:39.230 回答
1

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

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

于 2009-03-09T04:54:03.140 回答
1

我想投入我的 5 美分,当您的任务未运行时,使用任务调度程序将节省一些内存。

于 2009-06-25T22:48:44.710 回答