【发布时间】:2021-06-28 17:11:15
【问题描述】:
我有一个 C# 应用程序,它使用的 Windows 服务并不总是打开,我希望能够在服务启动和关闭时发送电子邮件通知。我已经编写了电子邮件脚本,但我似乎无法弄清楚如何检测服务状态的变化。
我一直在阅读 编辑:由于ServiceController 类,我认为WaitForStatus() 方法可能是我需要的,但我无法找到将它用于服务的示例那还没有开始。WaitForStatus()方法busy-waits,我需要在监听服务启动/停止的同时执行服务运行的程序的其余部分,我不认为这是适合我的方法,除非有人有解决方案,将这种方法与多线程结合使用并且干净高效。
更多:
- 应用程序不会启动该服务 - 应用程序用户将直接从“管理工具”中的“服务”窗口启动该服务。
- 所使用的服务不是默认的 Windows 服务 - 它是设计用于此应用程序的自定义服务
感谢您的帮助!
附:请注意,我对 C# 还很陌生,我在这里边学习边学习。
更新:
我已经设法在每次服务启动时发送警报电子邮件:当我继续阅读我拥有的代码时(很遗憾,我无法在此处发布),我注意到用于创建服务正在扩展 ServiceBase 类,并且有人制作了自定义 OnStart() 方法来覆盖默认方法。我向新的OnStart() 方法添加了必要的方法调用,它成功发送了通知。
我尝试对 OnStop() 方法做同样的事情,但这对我来说效果并不好 - 在我继续之前,我想补充一点,我已经用 Java 编程了好几年了,我我非常熟悉Java设计模式。
我试图做的,这本来可以在 Java 中工作,是用一个调用电子邮件通知的方法覆盖 ServiceBase 类的 OnStop() 方法,将 MyService 转换为 ServiceBase 类型,然后重新调用ServiceBase 类的Stop() 方法(注意:OnStop() 是一个受保护的方法,因此不能直接调用它——Stop() 方法调用OnStop(),然后继续使用必要的代码来停止服务)。我认为强制转换为ServiceBase 类型会强制调用默认的OnStop() 方法,而不是我的自定义方法。
正如您想象的那样,在我设法强制我的计算机硬关机之前,我最终成功发送了不到 10,000 封电子邮件到我的收件箱。
我现在需要的是一种方法来使用我重写的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 范围内的解决方案才是可行的。再次感谢您的帮助!
【问题讨论】:
-
对,但是应用程序没有检查事件的状态 - 它需要不断地监听状态变化
-
@Chriseyre2000:这是一个有效的解决方案,也是迄今为止我唯一拥有的解决方案。如果您想删除评论并使其成为答案,我会投票赞成,因为这是对 SO 的唯一答案。但是,正如文章本身所说,代码最终会变得混乱,我真的不能朝那个方向发展。
-
@Peter Ritchie:你所说的问题是重复的,它所链接的问题的答案适用于 C++ 而不是 C#。如果您愿意查看这些问题引用的文档,您会发现即使在 Microsoft 文档中也只显示或引用了 C++ 代码。我已经查找了 notifyservicestatuschange,但尚未在 C# 中使用该方法的任何地方找到一个示例。现在,如果此功能在 C# 中确实有效,请随时将其发布为答案,如果有效,我将升级并接受它。
-
@ZacharyKniebel 你可以通过 PInvoke 访问 C# 中的所有 Win32 函数,任何 Win32 C++ 都可以是 C#,如果你愿意的话,请努力。
标签: c# asp.net service event-handling