2010-09-15 5 views
6

Je suis un débutant complet à travailler avec les services Windows. J'ai un squelette de base a travaillé pour le service et je suis en train de faire ceci:Comment exécuter un exe à partir du service Windows et arrêter le service lorsque le processus exe se ferme?

protected override void OnStart(string[] args) 
    { 
     base.OnStart(args); 
     Process.Start(@"someProcess.exe"); 
    } 

juste feu de l'exe au début du programme. Cependant, je voudrais que le service s'arrête lui-même lorsque le processus a démarré à partir des sorties exe. Je suis assez sûr de devoir faire une sorte de threading (quelque chose avec lequel je suis aussi un débutant), mais je ne suis pas sûr du contour général de la façon dont cela fonctionne, ni de la façon spécifique d'arrêter un processus . Pourriez-vous m'aider avec le processus général pour cela (c'est-à-dire démarrer un thread à partir de OnStart, alors quoi ...?)? Merci.

Répondre

9

Vous pouvez utiliser un BackgroundWorker pour l'enfilage, utilisez Process.WaitForExit() pour attendre que le processus se termine jusqu'à ce que vous arrêtiez votre service.

Vous avez raison de faire du threading, faire beaucoup de travail dans le OnStart peut rendre les erreurs de démarrage incorrect de Windows lors du démarrage du service.

protected override void OnStart(string[] args) 
{ 

    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
    bw.RunWorkerAsync(); 
} 

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    Process p = new Process(); 
    p.StartInfo = new ProcessStartInfo("file.exe"); 
    p.Start(); 
    p.WaitForExit(); 
    base.Stop(); 
} 

Modifier Vous pouvez également déplacer le Process p à un membre de la classe et arrêter le processus dans le OnStop pour vous assurer que vous pouvez vous arrêter à nouveau le service si l'exe se détraque.

protected override void OnStop() 
{ 
    p.Kill(); 
} 
+0

Merci, cela a fonctionné à peu près exactement comme j'avais espéré. – xdumaine

1

someProcess.exe devrait avoir someLogic pour arrêter le service d'appel;)

Utilisez la classe ServiceController.

// Toggle the Telnet service - 
// If it is started (running, paused, etc), stop the service. 
// If it is stopped, start the service. 
ServiceController sc = new ServiceController("Telnet"); 
Console.WriteLine("The Telnet service status is currently set to {0}", 
        sc.Status.ToString()); 

if ((sc.Status.Equals(ServiceControllerStatus.Stopped)) || 
    (sc.Status.Equals(ServiceControllerStatus.StopPending))) 
{ 
    // Start the service if the current status is stopped. 

    Console.WriteLine("Starting the Telnet service..."); 
    sc.Start(); 
} 
else 
{ 
    // Stop the service if its status is not set to "Stopped". 

    Console.WriteLine("Stopping the Telnet service..."); 
    sc.Stop(); 
} 

// Refresh and display the current service status. 
sc.Refresh(); 
Console.WriteLine("The Telnet service status is now set to {0}.", 
        sc.Status.ToString()); 

Le code est tiré de la page liée ci-dessus.

+0

Merci, il semblerait que cela aboutirait au résultat final - si je développe l'exe aussi. N'est-ce pas plus une solution de contournement qu'une solution? Et cela ne fonctionnerait que si j'écris le .exe. Supposons que je n'ai pas accès à la source pour l'exe, et cela devrait toujours être possible via le service Windows lui-même. – xdumaine

2

Vous devez utiliser un ServiceController pour le faire, il a une méthode Stop. Assurez-vous que votre propriété a la propriété CanStop définie sur true.