6

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 ");
    }

}
4

3 回答 3

7

您不能从OnStart同一服务的方法中停止服务。

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

ERROR_SERVICE_CANNOT_ACCEPT_CTRL 请求的控制代码无法发送到服务,因为服务的状态为SERVICE_STOPPEDSERVICE_START_PENDINGSERVICE_STOP_PENDING

好吧,你猜怎么着——当你在你的OnStart方法中时,你的服务状态是SERVICE_START_PENDING.


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

于 2012-08-22T08:05:01.743 回答
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 ");
    }
}
于 2012-08-22T08:33:07.303 回答
0

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

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

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

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

于 2013-12-02T17:33:06.393 回答