【问题标题】:Is it bad practice to let ServiceController class running 24/7?让 ServiceController 类 24/7 运行是不好的做法吗?
【发布时间】:2015-12-24 08:12:45
【问题描述】:

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

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

提前致谢

【问题讨论】:

  • 如果您在 ServiceController 中很好地管理资源并且只创建了一个实例,我真的不明白为什么有必要关闭它。但是,如果您确实创建了多个在程序中某个时刻不再使用的实例,则应该关闭它们。
  • 我只是在想,也许 ServiceController 正在使用其他资源,这使得始终保持与服务的连接变得很糟糕?
  • 似乎不太可能。它将保持对服务开放的句柄(这很好),毫无疑问会使用一些内存进行簿记,但没有什么意义。您链接到的问题/答案是关于泄漏实例,而不是长时间保留单个实例。
  • 好的,谢谢!能够从远处检查和控制我们的服务真是太好了:)

标签: c# logging windows-services


【解决方案1】:

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

所以你的程序中基本上有很多线程,除了睡几个小时什么都不做。这很难看,线程是一个昂贵的操作系统对象。这些线程不会烧掉任何内核,但仍会涉及 OS 线程调度程序,当它们的休眠期到期时,它们会不断重新激活线程。

如果您需要这种对状态变化的响应,那没关系,但请记住,它的响应速度不能超过 250 毫秒。请记住,使用 Timer 增加间隔听起来很有吸引力,但请考虑轮询的问题。如果您这样做,例如,每分钟一次,并且管理员在两次轮询之间的 30 秒内停止并重新启动服务,那么您将永远不会看到状态更改。哎呀。

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

【讨论】:

  • 我希望在其中一项服务因意外错误而停止时得到通知。所以有人停止/启动服务不是问题,我唯一一次重新启动服务是在某些代码更改时。最好每分钟打开一次控制器,检查状态并关闭它,而不是使用WaitForStatus 找出服务何时停止?
  • “意外错误”非常模糊。服务应该记录这样的错误,因此您必须阅读日志并暂停自身或应该终止,因此您的 ServiceController 将无法连接并且读取状态会产生异常。视情况而定。
  • 我喜欢你回答的最后一句话,为每个服务创建一个服务控制器并每隔 x 时间轮询一次
猜你喜欢
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 2014-08-15
相关资源
最近更新 更多