2009-08-10 4 views
7

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

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

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

ответ

8

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

controller.WaitForStatus(ServiceControllerStatus.Running); 
+0

только проблема с этим - это говорит вам, когда служба работает, а не когда служба инициализировала себя и готова готовить нужный материал. Этого может быть достаточно для ОП, может и не быть. – gbjbaanb

+0

Я не уверен, но я считаю, что это статус ServiceControllerStatus.Running, когда служба полностью инициализирована (после вызова метода OnStart). До этого это ServiceControllerStatus.StartPending. –

+2

Это именно то, что мне нужно. Извините, что не заметил этот метод. Кроме того, я пьян до большого количества кофе. Я искал событие: P (мой плохой). Как дополнение к случаю - мне нужно было использовать метод Refresh() для обновления данных службы. В противном случае он показал, что он работает даже после Stop() (но он может быть связан с окнами 7, которые я использую). – kyrisu

1

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

+2

лол Я думаю, что вы MIS связаны, что URL –

+0

Это действительно хороший плазменный дисплей, хотя. :-) –

+0

hrmph. Но я * хочу * эту плазму так много :) Исправлена ​​связь, ура. – gbjbaanb

1

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

Darknight

1

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

This great article on C# threading, вероятно, лучший ресурс для получения информации о WaitHandles

0
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)); 
} 
Смежные вопросы