让 ServiceController class 运行 24/7 是不好的做法吗?

Is it bad practice to let ServiceController class running 24/7?

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

但我也看到 the answer to this question 指出 ServiceController 应该关闭并处置。让我的 ServiceController 7 天 24 小时等待直到我的任何服务停止是不是很糟糕?或者我应该使用 Quartz 或简单的 Timer 到 运行 每 x 时间检查一次?

提前致谢

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

所以你的程序中基本上有很多线程,除了睡眠之外什么都不做。这很丑陋,一个线程是一个昂贵的 OS 对象。这些线程不会消耗任何核心,但 OS 线程调度程序仍然参与其中,在它们的睡眠期到期时不断地重新激活线程。

如果您需要这种对状态变化的响应,那是可以的,但请记住,它的响应时间不能超过 250 毫秒。请记住,通过使用计时器增加间隔听起来很有吸引力,但请务必考虑轮询问题。如果你这样做,比如说,每分钟一次,管理员在两次轮询之间的 30 秒内停止并重新启动服务,那么你将永远看不到状态变化。哎呀

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