有关Windows服务的问题大多处于空闲状态

时间:2011-12-22 07:34:06

标签: c# windows-services installshield

我有一项Windows服务,每天运行一次2分钟的工作。剩下的23:58,它只是环顾四周。

我的问题首先涉及空闲时间:使用Timer.Tick还是Thread.Sleep更好?这两种资源之间是否存在差异?

其次,在空闲时间内,如果有人关闭Windows服务,我是否需要中断这些空闲线程以使程序干净地关闭,或者Shutdown会为我处理它吗?

第三,我是否使用Windows服务咆哮错误的树?将记录放入Windows任务计划程序似乎是有意义的,但我找不到任何方法使用InstallShield,这是我们用来部署我们的产品。有更好的想法吗?

6 个答案:

答案 0 :(得分:3)

如果您使用ThreadPool.QueueUserWorkItem启动后台线程,我认为您可以在其中使用Thread.Sleep,当您关闭服务时,您不必对其执行任何操作。我认为计时器勾选会在它打勾时自动为你创建线程,所以如果你使用它就必须做更少的事情(在两个计时器滴答中,我认为匹配你想要达到的更好,所以将是更好的选择)。

这肯定感觉就像你说的调度程序会做得更好。我不知道你是否可以直接在InstallShield中完成它,但也许你可以创建一个小的控制台应用程序,你从基于命令行参数的安装程序运行,或者与windows任务调度API对话 - {{3}注册自己或完成你想要实现的工作(即 - 安装 - 在日程安排上设置,没有args做你每天需要做的任何事情)。

我认为它是一个C ++ API,所以你可以做一些p / invoke,或者更好的是,在类libaray中只有一些托管C ++,并从基于c#的控制台应用程序引用它。

答案 1 :(得分:3)

FWIW,InstallShield没有定义计划任务的本机功能,但它确实支持VBScript,C ++和InstallScript自定义操作。所有这些选项都支持调用COM自动化接口,Microsoft通过一系列任务调度程序对象公开任务调度程序。

Task Scheduler Reference

除了CPU活动之外,一直运行的Windows服务也会消耗内存。事实上,每个版本的Windows都有较少的服务。

Why Windows 8 Uses So Much Less Memory Than Windows 7

答案 2 :(得分:2)

我会使用Timer.Tick。 Thread.Sleep阻塞线程,当你关闭服务时,你不能很好地中止线程。

答案 3 :(得分:2)

我建议您使用Windows服务,因为您只是复制其功能。

如果InstallShield不支持添加到任务计划程序,那么您是否可以让InstallShield在安装后运行批处理脚本或小型.net应用程序以将其添加到任务计划程序?

答案 4 :(得分:2)

只要您对日程安排的要求非常简单(就像现在这样),我认为服务方法很好。

就个人而言,我并不喜欢Windows调度程序,因为我发现它不稳定且难以维护(诚然,我没有在Windows 2008中尝试过新版本)。

如果我要构建一个具有更高级调度要求的应用程序,我可能会使用像Quartz.Net这样的调度库。

答案 5 :(得分:1)

如果您没有像autosys这样的调度应用程序,Windows服务应该是更好的选择,我也看不到thread.sleep中的任何伤害,它意味着暂停应用程序并利用  0%cpu