我有一个C#应用程序,它使用的Windows服务并非总是处于启动状态,我希望能够在服务启动和关闭时发送电子邮件通知。我写了电子邮件脚本,但我似乎无法弄清楚如何检测服务状态更改。检测/监听服务启动和停止状态更改
我一直在阅读
编辑:由于ServiceController
类,我认为
WaitForStatus()
方法可能是我需要的,但是我一直未能找到一个示例,它在尚未启动的服务上使用。
WaitForStatus()
方法busy-waiting,我需要执行由服务运行的程序的其余部分,同时收听服务启动/停止,我不认为这是方法我,除非有人使用这种方法结合多线程的解决方案,并且干净而高效。
更多:
- 该服务将不会被应用程序启动 - 应用程序的用户将在管理工具的服务窗口来启动直接。
- 使用的服务是不是默认的Windows服务 - 它被设计用于这种应用
感谢您的帮助的定制服务!
P.S.请注意,我对C#相当陌生,并且在我去这里学习。
UPDATE:
我设法得到报警邮件给每个服务启动时发送:当我继续通过我的代码阅读(我,不幸的是,不能发布这里),我注意到用于创建服务的类正在扩展ServiceBase
类,并且有人使用自定义OnStart()
方法来覆盖默认类。我添加了对新的OnStart()
方法的必要方法调用,并成功发送了通知。
我试图为OnStop()
方法做同样的事情,但对我来说这并没有那么好 - 在继续之前,我想补充一点,我已经用Java编程了好几年了,而且我非常熟悉Java设计模式。
我试图做的,这一点在Java工作过,是一个调用电子邮件通知重写ServiceBase
类的OnStop()
方法,投MyService
是ServiceBase
类型,然后再调用ServiceBase
类的Stop()
方法(注意:OnStop()
是一种受保护的方法,因此无法直接调用 - Stop()
方法调用OnStop()
,然后继续使用必要的代码停止服务)。我认为铸造ServiceBase
会强制调用默认的OnStop()
方法,而不是我自定义的方法。
正如你可以想像,我结束了刚刚1万个电子邮件成功发送到我的收件箱之前,我设法在我的电脑强行进入硬关机。
我现在需要的是一种方法,既可以使用我重写OnStop()
方法,然后把它调用默认的方法,或其他办法解决这个问题。任何和所有的帮助,非常感谢。非常感谢。
与多线程解决方案你所组成:
protected override void OnStart(string[] args) {
string subject = "Notice: Service Started";
string body = "This message is to notify you that the service " +
"has been started. This message was generated automatically.";
EmailNotification em = new EmailNotification(subject, body);
em.SendNotification();
...INITIALIZE LISTENER FOR SERVICE STOPPING HERE...
...custom stuff to be run on start...
}
而且,记住类调用此方法中,我们称之为Service
,扩展了ServiceBase
类。
更新两个:
的问候,我使用NotifyServerStatusChange
据我了解,这是不允许的解决方案中使用的系统功能,由于各种原因的建议。澄清一下,只有纯粹在C#和.NET范围内的解决方案才是可行的。再次感谢你的帮助!
看看wmi查询。 – Chriseyre2000 2012-07-30 19:39:53
没错,但应用程序没有检查事件的状态 - 它需要持续监听状态变化 – 2012-07-30 19:41:56
@ Chriseyre2000:这是一个有效的解决方案,迄今为止,我只有这个解决方案。如果你想删除评论并将其作为答案,我会对它进行投票,因为它是对此的唯一答案。然而,正如文章本身所说,代码会变得混乱,我真的不能朝这个方向前进。 – 2012-07-31 12:36:09