作为编写Windows服务和与他们通信的练习,我决定尝试编写一项服务来监控我的机器上的硬件性能,记录并每天报告。我希望能够远程查询服务并从中稍微研究一下,我想我可以在那里嵌入一个ServiceHost。
服务如何实际运行?我发现的例子都是OnStart..OnStop,ServiceHost.Run()就是这样。一个进程是无限期运行的,我是否必须在一个不断检查事物的地方写一个循环?
此外,通过服务使用WMI监控Windows机器报告磁盘空间,IO和内存使用情况是否现实?根据我的阅读,他们并不是最快的,而且正如我所看到的,我的服务将有一个轮询间隔,每隔几分钟检查一次统计数据。这会对机器产生不利影响吗?
答案 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分钟的间隔没有问题。