J'ai écrit un service Windows et une interface graphique pour cela. Bien sûr, GUI dépend principalement du service. Y a-t-il un moyen pour l'interface graphique d'attendre le service? Parfois, j'ai besoin de recharger la configuration de service de l'interface graphique et de redémarrer le service. P>
Je pensais à 2 solutions: 1. Utiliser tout en vous dormant pour attendre le statut de contrôleur de service (bien sûr, la solution la plus simple: p) 2. Implémenter une interface inotifiFiProperTychanged quelque part (cela semble compliqué pour ce problème trivial). P>
Je me demandais s'il y a une façon plus élégante de le faire? Y a-t-il un événement que je manque quelque part? P>
5 Réponses :
Utilisez un Objet d'événement de noyau . Lorsque vous démarrez les deux applications, demandez-leur de créer ou d'ouvrir un objet événement nommé, puis attendez-le dessus. L'autre peut le signaler en renversant l'état permettant ainsi à l'autre application d'arrêter d'attendre et de fonctionner. P>
C'est un très bon affichage plasma. :-)
hrmph. Mais je veux i> ce plasma tellement :) Correction du lien, acclamations.
J'aurais probablement apparemment une telle séparée pour simplement sonder et voir lorsque le statut de votre contrôleur de service a changé, lorsque le changement se produit, tuez ce fil. Ensuite, simplement reproduisez le fil lorsque vous devez commencer à ré-sonder p>
Servicecontroller a une méthode WaitForStatus où vous lui transmettez un argument de type ServiceControlerstatus. Vous pouvez l'utiliser comme ceci:
controller.WaitForStatus(ServiceControllerStatus.Running);
Seul des problèmes avec cela est qu'il vous indique lorsque le service est en cours d'exécution, pas lorsque le service s'est initialisé et qu'il est prêt à faire ce que vous voulez. Cela peut suffire pour la puissance, ce n'est peut-être pas.
Je ne suis pas sûr, mais je pense que le statut est ServiceControlStatus.Running lorsque le service est entièrement initialisé (après que la méthode OnStart a été appelée). Avant cela, c'est ServiceControlerstatus.Startpending.
C'est exactement ce dont j'avais besoin. Désolé de ne pas remarquer cette méthode. En dehors de cela, je suis ivre de beaucoup de café, je cherchais un événement: p (mon mauvais). Tout comme un ajout au cas - je devais utiliser la méthode d'actualisation () pour mettre à jour les données de service. Sinon, il l'a montré comme en cours d'exécution même après l'arrêt () (mais cela pourrait être connecté à Windows 7, j'utilise).
Utilisez un EventWaithandle strong> < / a>. Votre interface graphique peut attendre sur le WAITHANDLE et le service la définira qui déclenchera l'interface graphique pour continuer avec ce qu'elle faisait avant de commencer à attendre. Pas de vote, pas de bouclage, pas de désordre. P>
Ce grand article sur c # filetage strong> est probablement une meilleure ressource pour info sur WAITHANDLES P>
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));
}