Как заставить GUI ждать службы Windows? - PullRequest
7 голосов
/ 10 августа 2009

Я написал службу Windows и графический интерфейс для него. Конечно GUI в основном зависит от сервиса. Есть ли способ для графического интерфейса ждать службы? Иногда мне нужно перезагрузить службу конфигурации из графического интерфейса и перезапустить службу.

Я думал о 2 решениях: 1. используя while и sleep для ожидания изменения статуса сервисного контроллера (конечно, самое простое решение: P) 2. реализовать где-нибудь интерфейс INotifiPropertyChanged (это выглядит сложным для этой тривиальной проблемы).

Мне было интересно, есть ли более элегантный способ сделать это? Есть ли событие, которое я где-то пропускаю?

Ответы [ 5 ]

8 голосов
/ 10 августа 2009

ServiceController имеет метод WaitForStatus, где вы передаете ему аргумент типа ServiceControllerStatus. Вы можете использовать это так:

controller.WaitForStatus(ServiceControllerStatus.Running);
1 голос
/ 10 августа 2009

Используйте EventWaitHandle . Ваш GUI может ждать на WaitHandle, и служба установит его, что приведет к тому, что GUI продолжит выполнять то, что он делал, до того, как начал ждать. Без опроса, без зацикливания, без беспорядка.

Эта замечательная статья о потоке C # , вероятно, является лучшим источником информации о WaitHandles

1 голос
/ 10 августа 2009

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

Darknight

1 голос
/ 10 августа 2009

Использовать объект события ядра . Когда вы запустите оба приложения, попросите их создать или открыть именованный объект Event, а затем подождите его. Другой может сигнализировать об этом, переворачивая состояние, позволяя другому приложению перестать ждать и запустить.

0 голосов
/ 31 марта 2012
ServiceController mysqlServiceController = new ServiceController();
mysqlServiceController.ServiceName = "MySql";
var timeout = 3000;

myServiceController.Start();

try
{
    //Wait till the service runs mysql      
    ServiceController.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running, new TimeSpan(0, timeout, 0));
}
catch (System.ServiceProcess.TimeoutException)
{
    MessageBox.Show(string.Format("Starting the service \"{0}\" has reached to a timeout of ({1}) minutes, please check the service.", mysqlServiceController.ServiceName, timeout));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...