无法重新启动服务

use*_*084 0 c# windows-services

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

我可以单独启动和停止但不重启,这涉及到我首先停止并启动服务.

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
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

它只是进入捕获部分.

我不知道我哪里错了.

有什么建议.??

更新:

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

这是需要做的事情>

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Dir*_*mar 5

有一个空的捕获块捕获所有异常很少是一个好主意,因为严重的问题很容易漏掉.

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

catch (Exception ex)
{
    System.Diagnostics.Trace.WriteLine(ex.ToString());
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在服务的构造函数中附加跟踪侦听器,也可以使用Sysinternals中的DebugView工具来读取跟踪消息.如果您想更进一步,可能需要在项目中包含log4net等日志库.

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

更新:

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

if  (!(service.Status.Equals(ServiceControllerStatus.Stopped) 
       || service.Status.Equals(ServiceControllerStatus.StopPending)))
{
    service.Stop();
}
service.Start();
Run Code Online (Sandbox Code Playgroud)