Как запустить exe из службы Windows и остановить службу при выходе из процесса? - PullRequest
6 голосов
/ 15 сентября 2010

Я полный новичок в работе с Windows Services. У меня есть базовый скелет, разработанный для службы, и в настоящее время я делаю это:

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

просто для запуска exe в начале программы.

Однако я бы хотел, чтобы служба сама остановилась, когда процесс, запущенный из программы exe, завершился. Я почти уверен, что мне нужно сделать что-то вроде многопоточности (с этим я тоже начинающий), но я не уверен ни в общих чертах о том, как это работает, ни в конкретном способе остановки процесса внутри себя. Не могли бы вы помочь мне с общим процессом для этого (то есть начать поток с OnStart, а затем что ...?)? Благодарю.

Ответы [ 3 ]

11 голосов
/ 15 сентября 2010

Вы можете использовать BackgroundWorker для потоков, используйте Process.WaitForExit(), чтобы дождаться завершения процесса, пока вы не остановите свою службу.

Вы правы в том, что вам нужно выполнить несколько потоков, поскольку при выполнении OnStart при выполнении большого количества работы могут возникать ошибки, связанные с неправильным запуском из Windows при запуске службы.

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();
}

Редактировать Вы также можете захотеть переместить Process p к члену класса и остановить процесс в OnStop, чтобы убедиться, что вы можете снова остановить службу, если exe выходит из строя.

protected override void OnStop()
{
    p.Kill();
}
2 голосов
/ 15 сентября 2010

Для этого нужно использовать ServiceController, для этого есть метод Stop . Убедитесь, что для вашего сервиса свойство CanStop установлено в значение true.

1 голос
/ 15 сентября 2010

someProcess.exe должен иметь someLogic для остановки вызывающей службы;)

Использовать класс 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());

Кодсо страницы, указанной выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...