创建用于监控的服务

时间:2010-07-21 04:36:05

标签: c# .net windows wcf service

作为编写Windows服务和与他们通信的练习,我决定尝试编写一项服务来监控我的机器上的硬件性能,记录并每天报告。我希望能够远程查询服务并从中稍微研究一下,我想我可以在那里嵌入一个ServiceHost。

服务如何实际运行?我发现的例子都是OnStart..OnStop,ServiceHost.Run()就是这样。一个进程是无限期运行的,我是否必须在一个不断检查事物的地方写一个循环?

此外,通过服务使用WMI监控Windows机器报告磁盘空间,IO和内存使用情况是否现实?根据我的阅读,他们并不是最快的,而且正如我所看到的,我的服务将有一个轮询间隔,每隔几分钟检查一次统计数据。这会对机器产生不利影响吗?

3 个答案:

答案 0 :(得分:1)

我喜欢实现启动/停止/关闭启动的服务,并停止计时器,在配置中设置间隔。

当计时器事件触发时,我通常会停止计时器,处理任务并重新启动计时器(启动/停止关闭设置一个在重新启动之前检查的标志)这适用于长时间运行的任务(即如果它的设置非常短,可能会在间隔时间内运行的任务)

如果您每隔几分钟检查一次,WMI的速度可能无关紧要,但无论如何,请研究报告这些标准的各种方法,并寻找最有效的方法。

另一件好事是调整Program.cs,以便应用程序可以获取参数并自行安装/卸载,并通过运行exe(即不作为服务)运行任务一次这有助于调试服务。见:Installing Windows Service programmatically

答案 1 :(得分:1)

查看this有关如何编写与您正在执行的操作非常相似的服务(例如,重复调用某些功能)的示例(和解释)。

要回答您的问题,您有责任采取措施确保您的代码定期运行。您可以通过在计时器上注册回调或启动循环运行的线程直到调用OnStop方法来执行此操作。

至于通过WMI监控机器 - 您每隔几分钟收集的统计数量不应该导致问题。我见过很多数据收集的情况,相对而言,没有产生重大影响。

答案 2 :(得分:1)

Windows服务通过Service Control Manager (SCM)服务接收启动和停止命令(控制请求)。 这种“超级服务”在Windows启动序列的早期启动,并负责启动所有其他服务。

  

服务功能为SCM执行的以下任务提供了一个界面:

     
      
  • 维护已安装服务的数据库。
  •   
  • 在系统启动时或按需启动服务和驱动程序服务。
  •   
  • 枚举已安装的服务和驱动程序服务。
  •   
  • 维护运行服务和驱动程序服务的状态信息。
  •   
  • 将控制请求传输到正在运行的服务。
  •   
  • 锁定和解锁服务数据库。
  •   

有关可用SCM功能的指示,请参阅Starting Services on Demand

  

用户可以使用“服务”控制面板实用程序启动服务。用户可以在“开始参数”字段中指定服务的参数。服务控制程序可以启动服务并使用StartService函数指定其参数。

关于监视函数生成的负载,您必须使用轮询间隔并确定可接受的开销。 通常,2到5分钟的间隔没有问题。