无法重新启动服务

时间:2010-07-22 14:34:40

标签: 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
{
    // ...
}

它只是进入捕获部分。

我不知道我哪里出错了。

任何建议。??

更新:

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

这是需要做的事情>

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

1 个答案:

答案 0 :(得分:5)

有一个空的catch块可以捕获所有异常,因为严重的问题很容易漏掉。

将代码修改为至少在catch块中进行一些记录,例如

catch (Exception ex)
{
    System.Diagnostics.Trace.WriteLine(ex.ToString());
}

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

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

<强>更新

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

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