什么是主动监视.NET Windows服务是否仍在运行(例如未挂起)的最佳方法?服务需要定期响应计时器引发的事件。
谢谢 (xiè xie)
乔恩
什么是主动监视.NET Windows服务是否仍在运行(例如未挂起)的最佳方法?服务需要定期响应计时器引发的事件。
谢谢 (xiè xie)
乔恩
“无挂”的状态始终是一个难以确定的条件,具体取决于您提供的服务细节。
通常,任何形式的进程间通信都可以使用。一种简单的方法是创建一个具名共享内存映射,并定期从您的服务向其写入信息。另一个进程可以监视共享内存,并查看其状态是否停止变化。
这种方法的优点在于,您可以扩展共享内存块,以包含其他可能帮助诊断任何问题的诊断。
一种方法是在.NET中创建自己的性能计数器:
将此翻译为中文:http://msdn.microsoft.com/en-us/library/5e3s61wf(VS.71).aspx
然后将计数器与计时器中的“活跃秒数”相结合。
明显的解决办法似乎是,检查它是否仍在响应。因此添加一个低频看门狗定时器。我不知道您想监视生命力的地方在哪里,但在大多数地方,您应该能够从命名管道中读取。然后将看门狗定时器事件转换为写入命名管道。如果您观察不到读取,则知道您的服务至少在一个定时器上未能响应。
您可以创建一个命名的事件或互斥量,然后在代码执行时切换它。然后,外部程序可以看到这个脉动,表示程序正在运行。
我还使用了在另一个线程中运行的内部看门狗系统。该线程观察主线程的活动,例如日志输出或切换事件。如果未看到活动,则认为服务已挂起,我会关闭该服务。在这种情况下,您可以配置Windows自动重新启动已停止的服务,这可能会清除问题(前提是它不是内部逻辑错误)。
我使用的服务还有文本日志,写入日志中。对于即将“休眠一会儿”的服务,我会记录下次唤醒时间。我使用MTAIL来监视输出的日志。