C# 无法重新启动服务

C# 无法重新启动服务,c#,windows-services,C#,Windows Services,我有此代码来重新启动服务,但这不起作用 我可以单独启动和停止,但不能重新启动,这需要我首先停止和启动服务 try { //service.Stop(); //service.Start(); int millisec1 = Environment.TickCount; TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); service.Stop(); service

我有此代码来重新启动服务,但这不起作用

我可以单独启动和停止,但不能重新启动,这需要我首先停止和启动服务

try
{
    //service.Stop();
    //service.Start();
    int millisec1 = Environment.TickCount;
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

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

    // count the rest of the timeout
    int millisec2 = Environment.TickCount;
    timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1));

    service.Start();
    service.WaitForStatus(ServiceControllerStatus.Running, timeout);
}
catch
{
    // ...
}
它只是进入了捕捉区

我不知道我错在哪里

有什么建议吗

更新:

所以我从下面的正确答案中得出了这个想法:

这就是需要做的>

public static void RestartService(string serviceName, int timeoutMilliseconds)
{
    ServiceController service = new ServiceController(serviceName);

    int millisec1 = Environment.TickCount;
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
    if (!(service.Status.Equals(ServiceControllerStatus.Stopped) || service.Status.Equals(ServiceControllerStatus.StopPending)))
    {
        service.Stop();
        service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
    }
    // count the rest of the timeout
    int millisec2 = Environment.TickCount;
    timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds - (millisec2 - millisec1));

    if (!(service.Status.Equals(ServiceControllerStatus.Running) || service.Status.Equals(ServiceControllerStatus.StartPending)))
    {
        service.Start();
        service.WaitForStatus(ServiceControllerStatus.Running, timeout);
    }
}

让一个空的catch块捕获所有异常很少是一个好主意,因为严重的问题很容易通过

修改代码,至少在catch块中做一些日志记录,例如

catch (Exception ex)
{
    System.Diagnostics.Trace.WriteLine(ex.ToString());
}
然后,您可以在服务的构造函数中附加跟踪侦听器,或者使用Sysinternals中的工具来读取跟踪消息。如果您想更进一步,您可能希望在项目中包括一个日志库,如log4net

我猜您会得到一个
TimeoutException
,因为停止服务所需的时间比您预期的要长。您是否尝试过通过删除timeout参数来增加超时或无限等待

更新:

您可能需要检查服务是否已启动:

if  (!(service.Status.Equals(ServiceControllerStatus.Stopped) 
       || service.Status.Equals(ServiceControllerStatus.StopPending)))
{
    service.Stop();
}
service.Start();

让一个空的catch块捕获所有异常很少是一个好主意,因为严重的问题很容易通过

修改代码,至少在catch块中做一些日志记录,例如

catch (Exception ex)
{
    System.Diagnostics.Trace.WriteLine(ex.ToString());
}
然后,您可以在服务的构造函数中附加跟踪侦听器,或者使用Sysinternals中的工具来读取跟踪消息。如果您想更进一步,您可能希望在项目中包括一个日志库,如log4net

我猜您会得到一个
TimeoutException
,因为停止服务所需的时间比您预期的要长。您是否尝试过通过删除timeout参数来增加超时或无限等待

更新:

您可能需要检查服务是否已启动:

if  (!(service.Status.Equals(ServiceControllerStatus.Stopped) 
       || service.Status.Equals(ServiceControllerStatus.StopPending)))
{
    service.Stop();
}
service.Start();


catch
更改为
catch(Exception ex)
,并将异常保存到日志文件或Windows事件日志中。然后请发布该异常的文本,我们将能够解决实际出现的问题。目前,人们能给出的唯一建议是“异常正在发生”。也许你应该阅读异常,它被引发,而不是抑制它。可能会有帮助;o) 你看到了什么例外?您应该捕获一些异常,以便获取和记录消息。捕获中会出现什么异常?因此server.Stop不工作。我在堆栈跟踪中得到错误:“服务尚未启动”,它显示:“[Win32Exception(0x80004005):服务尚未启动][InvalidOperationException:无法停止计算机上的XYZService服务”。]System.ServiceProcess.ServiceController.stop()+410”将
catch
更改为
catch(异常示例)
并将异常保存到日志文件或Windows事件日志中。然后请发布该异常的文本,我们将能够解决实际出现的问题。目前,人们能给出的唯一建议是“异常正在发生”。也许你应该阅读异常,它被引发,而不是抑制它。可能会有帮助;o) 你看到了什么例外?您应该捕获一些异常,以便获取和记录消息。捕获中会出现什么异常?因此server.Stop不工作。我在堆栈跟踪中得到错误:“服务尚未启动”,它显示:“[Win32Exception(0x80004005):服务尚未启动][InvalidOperationException:无法停止计算机上的XYZService服务”。]System.ServiceProcess.ServiceController.stop()+410”,因此服务器.stop不工作。我在堆栈跟踪中得到错误:“服务尚未启动”,它显示:“[Win32Exception(0x80004005):服务尚未启动][InvalidOperationException:无法停止计算机上的XYZService服务”。]System.ServiceProcess.ServiceController.stop()+410”因此,在上面的代码中发生的情况是,如果条件为true,它将停止服务并进行回发,这样th就不会执行服务。Start()。所以服务正在停止,但没有重新启动。@user175084:“回发”是什么意思?如果服务未处于Stopped或StopPending状态,上面的示例代码将停止该服务。之后,它将启动服务。因此,当服务已经启动,您按下重新启动。。。我再次收到错误,说服务尚未启动][InvalidOperationException:无法在计算机“”上启动XYZService服务。@user175084:您是否查询了服务控制器的当前状态?它告诉您什么?因此服务器.Stop不工作。我在显示的堆栈跟踪中收到错误:“服务尚未启动”:[Win32Exception(0x80004005):服务尚未启动][InvalidOperationException:无法停止计算机“”上的XYZSService服务。]System.ServiceProcess.ServiceController.stop()+410”因此,上述代码中出现的情况是,如果条件为true,则停止服务并进行回发,这样th就不会执行服务。Start()。因此服务正在停止,但不会重新启动。@user175084:“回发”是什么意思?如果服务未处于“已停止”或“停止终止”状态,上述示例代码将停止该服务。之后,它将启动该服务。因此,当服务已启动且您按“重新启动”时,我再次收到错误消息,表示该服务尚未启动][InvalidOperationException:无法在计算机“”上启动XYZSService服务。@user175084:您是否查询了服务控制器的当前状态?它告诉您什么?