我想在客户没有许可证时以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 ");
}
}
答案 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深入到我的代码中,将其作为实验删除,所以我没有进一步调查。