让ServiceController类全天候运行是不好的做法吗?

时间:2015-12-24 08:12:45

标签: c# logging windows-services

我有多个windows services在服务器上全天候运行。对于记录事件等我已经使用log4net但我希望能够看到我的所有服务是否仍在运行。所以我偶然发现this question并了解了ServiceController课程。现在我已经有了创建另一项服务的想法,我在其中为每个服务创建一个ServiceController对象,并在任何服务停止时使用WaitForStatus方法通知。我可以通过服务控制器服务中的托管WCF从外部检查任何状态。

但我也看到the answer to this question指出ServiceController应该关闭并处理掉。让我的ServiceController在我的任何服务停止之前全天候等待是不是很糟糕?或者我应该使用Quartz还是简单的Timer每隔x个时间运行一次检查?

提前致谢

1 个答案:

答案 0 :(得分:1)

你不应该。 Windows中没有任何机制可以让服务状态更改生成事件。所以ServiceController.WaitForStatus()必须 poll 。硬编码每秒查询服务状态4次,Thread.Sleep(250)硬编码轮询间隔。使用反编译器自己查看。

所以你的程序中基本上有很多线程,除了睡几个小时之外什么都不做。这非常难看,一个线程是一个昂贵的OS对象。这些线程不会刻录任何核心,但OS线程调度程序仍然存在,在睡眠期到期时不断重新激活线程。

如果您需要这种对状态更改的响应,那么它是可以的,但请记住,它不能比250毫秒更具响应性。请记住,通过使用计时器增加间隔听起来很有吸引力,但确实考虑了轮询问题。如果你这样做,比如每分钟一次并且管理员停止并重新启动服务,比如两次民意调查之间的30秒,那么你永远不会看到状态发生变化。糟糕。

考虑仅使用通过其Status属性查询许多 ServiceControllers的一个线程。您自己的轮询代码,减去线程的成本。

相关问题