Я пишу приложение для программного запуска/остановки службы 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 секунд). Если я переведу логику начала/остановки в пользовательский интерфейс, все станет нормально.
Какую глупую ошибку я делаю здесь?
Любая вероятность того, что служба находится в состоянии, отличном от бега или остановленного при вызове StopService()? Например, начать отложенное или приостановить? (Вы можете проверить из командной строки 'sc status'.) –
В моих тестах я убедился (статус sc), что служба была запущена до вызова StopService(). Также служба фактически останавливается (и в конечном итоге останавливается) - просто StopService() возвращается раньше вызывающему абоненту до завершения WaitForStatus(). – Jim