Не могу перезапустить Сервис - PullRequest
0 голосов
/ 22 июля 2010

У меня есть этот код для перезапуска службы, но это не работает.

Я могу запускать и останавливать по отдельности, но не перезапускать, что требует от меня первой остановки и запуска службы.

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

Это просто происходит в секции catch.

Я не знаю, где я иду не так.

Любые предложения .??

UPDATE:

Итак, я взял идею из правильного ответа ниже:

Вот что нужно сделать>

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 Ответ

5 голосов
/ 22 июля 2010

Наличие пустого блока catch для перехвата всех исключений редко является хорошей идеей, поскольку серьезные проблемы легко исчезают.

Измените свой код, чтобы хотя бы выполнить некоторую регистрацию в блоке catch, например,

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

Затем вы можете присоединить прослушиватель трассировки в конструкторе вашей службы или использовать инструмент DebugView из Sysinternals для чтения сообщения трассировки. Если вы хотите сделать еще один шаг вперед, вы можете включить в свой проект библиотеку журналов, например log4net.

Полагаю, вы получаете TimeoutException, потому что остановка службы занимает больше времени, чем вы ожидали. Вы пытались увеличить время ожидания или бесконечно ждать, удалив параметр времени ожидания?

Обновление:

Возможно, вам необходимо проверить, запущена ваша служба или нет:

if  (!(service.Status.Equals(ServiceControllerStatus.Stopped) 
       || service.Status.Equals(ServiceControllerStatus.StopPending)))
{
    service.Stop();
}
service.Start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...