在onStart()方法中停止windows服务

时间:2012-08-22 07:46:29

标签: c# windows-services

我想在客户没有许可证时以onStart()方法停止Windows服务。我使用service.Stop(),但它不起作用。

protected override void OnStart(string[] args)
{
    try
    {
        _bridgeServiceEventLog.WriteEntry("new OnStart");
                 if (LicenseValidetor.ValidCountAndTypeDevices())
            {
                WsInitializeBridge();
            }
                 else
                 {
                      service = new ServiceController("BridgeService");
                      service.Stop();
                     _bridgeServiceEventLog.WriteEntry("LicenseValidetor Error");
                 }
        _bridgeServiceEventLog.WriteEntry("end Start");
    }
    catch (Exception e)
    {
        _bridgeServiceEventLog.WriteEntry("error In onstart method ");
    }

}

3 个答案:

答案 0 :(得分:7)

您无法在同一服务的OnStart方法中停止服务。

ServiceController.Stop方法在内部调用ControlService(或Ex对应方式)。请注意,此功能失败的原因之一是:

  

<强> ERROR_SERVICE_CANNOT_ACCEPT_CTRL   请求的控制代码无法发送到服务,因为服务状态为 SERVICE_STOPPED SERVICE_START_PENDING SERVICE_STOP_PENDING

嗯,猜猜看 - 当你进入OnStart方法时,你的服务状态为SERVICE_START_PENDING


应对这种情况的正确方法是发出任何其他线程的信号,表明您可能已经开始退出它们,然后退出OnStart方法。服务控制管理员会注意到该流程已退出,并将您的服务状态恢复为SERVICE_STOPPED。它还可以通知交互式用户“服务已启动然后停止”或相应的单词。

答案 1 :(得分:0)

我注意到你不是在等待确保服务实际上已停止,或者它是否在第一次运行中运行。

这样做: -

protected override void OnStart(string[] args)
{
    try
    {
        _bridgeServiceEventLog.WriteEntry("new OnStart");
                 if (LicenseValidetor.ValidCountAndTypeDevices())
            {
                WsInitializeBridge();
            }
                 else
                 {

                   int time = 10000;

                   TimeSpan timeout = TimeSpan.FromMilliseconds(time);

                   service.Stop();
                   service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);

                   _bridgeServiceEventLog.WriteEntry("LicenseValidetor Error");

            }
        _bridgeServiceEventLog.WriteEntry("end Start");
    }
    catch (Exception e)
    {
        _bridgeServiceEventLog.WriteEntry("error In onstart method ");
    }

答案 2 :(得分:0)

我想补充一点,“根本不启动任何工人”可能行不通(或者我可能只是简单的愚蠢;)。

我在OnStart代码周围使用try / catch(all)构建了一个服务。由于我的.config文件中缺少一行,因此在启动任何工作线程之前,它会因IOException而崩溃。跳过我的线程启动器的异常。我的代码没有启动任何线程。诚实。

但是服务没有停止。我不知道为什么。作为一种绝望的措施,我重新提出了例外,这有助于。

我仍然想知道Enterprise Library配置中的文件系统观察程序线程是否存在问题。 EntLib深入到我的代码中,将其作为实验删除,所以我没有进一步调查。