2015-06-23 4 views
2

Я пишу приложение для программного запуска/остановки службы Windows с помощью ServiceController. У меня есть UI-класс, который имеет некоторые колокола и свистки UI и класс Helper, который запускает и останавливает службу.Calling ServiceController.WaitForStatus в другом методе немедленно возвращается

В классе Helper:

void StopService() 
{ 
    var controller = new ServiceController("MyService"); 

    if (controller.Status == ServiceControllerStatus.Running) 
    { 
     controller.Stop(); 
     controller.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 60)); 
    } 
} 

В классе UI:

Helper.StopService(); 

var controller = new ServiceController("MyService"); 

if (controller.Status == ServiceControllerStatus.Stopped) 
{ 
    // Do some stuff 
} 
else 
{ 
    // MyService not stopped. Explode! 
} 

Проблема в том, что, когда служба останавливается, метод в помощнике немедленно возвращается к вызывающему в классе UI , не дожидаясь остановки службы (услуга в конце концов прекращается примерно через 5-10 секунд). Если я переведу логику начала/остановки в пользовательский интерфейс, все станет нормально.

Какую глупую ошибку я делаю здесь?

+0

Любая вероятность того, что служба находится в состоянии, отличном от бега или остановленного при вызове StopService()? Например, начать отложенное или приостановить? (Вы можете проверить из командной строки 'sc status'.) –

+0

В моих тестах я убедился (статус sc), что служба была запущена до вызова StopService(). Также служба фактически останавливается (и в конечном итоге останавливается) - просто StopService() возвращается раньше вызывающему абоненту до завершения WaitForStatus(). – Jim

ответ

0

Вместо ServiceController.WaitForStatus() вы можете использовать цикл задержки/обновления, как показано на MSDN в ServiceController Class, но лучше было бы, вероятно, использует ожидание Async для статуса, как, что подробно описано в this answer.

sc.Stop(); 
while (sc.Status != ServiceControllerStatus.Stopped) 
{ 
    Thread.Sleep(1000); 
    sc.Refresh(); 
} 
Смежные вопросы