C# 检查服务是否挂起的最佳方法

C# 检查服务是否挂起的最佳方法,c#,service,monitoring,C#,Service,Monitoring,我有一个关于如何最好地检查服务是否仍在运行的问题 首先要澄清一下。我拥有的服务是一个C#应用程序,可以从命令行运行,也可以作为Windows服务运行。该服务的功能是检查对远程第三方数据源的更改,并在将这些更改添加到我们自己的本地数据存储之前处理这些更改 我希望能够识别服务何时因任何原因停止运行,并在发生这种情况时尽可能自动地通知某人。无论服务是作为Windows服务运行还是从命令行运行,都需要这样做 我已经考虑过监控本地数据存储的更改,并在一段时间内未发生更改时发出通知,但事实证明这有点太不一致

我有一个关于如何最好地检查服务是否仍在运行的问题

首先要澄清一下。我拥有的服务是一个C#应用程序,可以从命令行运行,也可以作为Windows服务运行。该服务的功能是检查对远程第三方数据源的更改,并在将这些更改添加到我们自己的本地数据存储之前处理这些更改

我希望能够识别服务何时因任何原因停止运行,并在发生这种情况时尽可能自动地通知某人。无论服务是作为Windows服务运行还是从命令行运行,都需要这样做

我已经考虑过监控本地数据存储的更改,并在一段时间内未发生更改时发出通知,但事实证明这有点太不一致,因为第三方数据源的更改频率是可变的,这意味着长期缺少更改并不一定意味着服务已经停止工作,可能只是没有更改

对于我如何监控这一点,有什么建议吗?有人有过类似的工作经验吗

谢谢,M

编辑1 让我们大致了解一下服务的工作原理:当有新的/更新的数据可用时,第三方服务会引发事件,因此我的服务会等待这些事件的发生,并处理在引发的事件中返回的数据。因此,这就是为什么很难确定何时“没有变化”而不是“服务崩溃”

编辑2
我想我需要更清楚一点:这种监视的主要原因是通知用户服务或与第三方服务连接的潜在问题。服务本身是单线程的,并具有适当的异常处理和日志记录。这项服务可能会在某个服务器上运行,因此,如果该服务出现任何问题,并且由于任何原因停止更新本地数据存储,该服务需要通知某人

>P>你可能想考虑一些类似的“心跳”:

但您的主要考虑应该是找出为什么您的服务应该能够停止/挂起?需要捕获所有异常,在最坏的情况下,在短时间等待后将服务重置为其启动状态,以防止CPU最大化

Windows本身也有多种方法可以提供帮助:

Start > Run > Services.msc > Right Click Service > Properties > Recovery Options
如果您将应用程序设计为正确使用异常并适当处理它们,那么您的服务“因某种原因挂起”就不会有问题

附加:


您是否无法确定“无需工作”和挂起之间的区别

您可以使用.net中的ServiceController类来监视服务

我在我的一个项目中遇到了同样的问题

我使用以下方法来监控我的服务

  • 首先,我以这样的标准格式将我的服务中的所有信息、错误记录到事件查看器中
自定义事件ID |日期时间|消息

  • 然后我又创建了一个通知服务,它将侦听 对于特定事件的事件查看器,从 事件条目
  • 如果事件条目落在事件查看器中,它将发送邮件 通过smtp发送通知
  • 如果未提供smpt,请选择windows应用程序 它侦听事件并使用阳台或消息显示消息 盒子

这个项目的解决方案是使用类似心跳的实现,让服务通知我它的可用性

因为我们的应用程序使用WebAPI,所以我能够设置一个端点,服务每隔[x]秒“ping”一次

添加了一个单独的进程,用于检查服务最后一次通知的日期和时间,如果该日期和时间不在设置的阈值范围内,我将通知用户该服务不可用


我考虑过使用ServiceController,但这不是一个理想的解决方案,因为添加到服务中的功能可能会作为Windows控制台应用程序而不是Windows服务运行。

您的服务是否有某种轮询循环?您能给我们一个什么的伪轮廓吗你的服务真的有用吗?我们可以帮助确定放置某种形式心跳的位置。最糟糕的是,如果服务是多线程的,并且发生了livelock或死锁。@MatthewWatson是的,心跳可能会有帮助,但我仍然希望考虑根本原因。死锁和活锁几乎总是可以通过适当的线程安全编程来纠正的。