Windows服务状态更改时获取通知?

时间:2018-02-21 18:34:44

标签: c# windows-services

我试图找出当Windows服务状态发生变化时如何获得通知。首先,我尝试使用ServiceControl.State检查每个视图秒的状态的计时器。我发现这个“NotifyServiceStatusChange”,但没有例子或类似的东西,也不知道如何使用它。

或者还有其他方法吗?

背景资料: 我有一个申请。该应用程序有2个按钮。每次服务状态改变时,应禁用其中一个按钮。与服务状态运行一样,然后禁用“启动服务”按钮。

2 个答案:

答案 0 :(得分:0)

你看过ServiceController Class了吗?这样的事情应该让你开始。

ServiceController sc = new ServiceController("ServiceName");
switch (sc.Status)
{
    case ServiceControllerStatus.Running:
        break;
    case ServiceControllerStatus.Stopped:
        break;
    case ServiceControllerStatus.Paused:
        break;
}

如果您想避免不断轮询计时器,可以查看WaitForStatus。让后台工作人员始终等待指定状态以启用按钮,禁用按钮或其他任何内容。

这是一个非常基本的例子,但要回答关于无限循环的问题 - 没有。看看我的评论和调试步骤,你会明白为什么。

ServiceController sc = new ServiceController("ServiceName");
for (;;)
{
     // for pauses execution, waiting for stopped status.
     sc.WaitForStatus(ServiceControllerStatus.Stopped);
     // continues when stopped status signaled, disable button 

     // for waiting for running status.
     sc.WaitForStatus(ServiceControllerStatus.Running);
     //continues when running status signaled, enable button
     // for will continue but wait for stopped status signal

}

这就是为什么我建议在后台工作程序中执行此检查,或者只是在主线程之外执行此操作,以便在等待状态更改时整个应用程序不会被卡住。

答案 1 :(得分:0)

如果我理解正确,你有一个在后台运行的Windows服务和另一个想要通知的应用程序。 如果是这种情况,您将需要在它们之间实现某种形式的通信。 根据您的要求以及运行解决方案的位置,您可以使用Message Queue(例如MSMQ)来订阅/广播您的消息。另一种方法是使用一些实时通信(如TCP / Socket,signalR或甚至使用firebase通知你的应用程序)。