C # Ожидание запуска других служб

2

Я пишу службу Windows, которая полагается на другие службы, как мне ждать, пока начнут работать другие службы?

Спасибо

Теги:

6 ответов

3

Я думаю, вы стремитесь к этой строке

installer.ServicesDependedOn = новая строка [] { "DependenceService" };

вот так:

using (ServiceProcessInstaller processInstaller = new ServiceProcessInstaller())
{
    processInstaller.Account = ServiceAccount.LocalSystem;
    processInstaller.Username = null;
    processInstaller.Password = null; 

    using (ServiceInstaller installer = new ServiceInstaller())
    {
        installer.DisplayName = "yourservice.";
        installer.StartType = ServiceStartMode.Automatic;
        installer.ServiceName = "YourService";

        installer.ServicesDependedOn = new string [] { "DependenceService" };
        this.Installers.Add(processInstaller);
        this.Installers.Add(installer);
    }
}

удача

  • 0
    Зависимые службы запускаются автоматически при запуске службы, но она не запускается автоматически, когда они уже запущены. И это был вопрос, как я понял.
  • 0
    опс ... извините, если я неправильно понял проблему.
Показать ещё 3 комментария
3

В дополнение к тому, что другие ответы указали alredy, если одной из этих служб является SQL Server, вам нужно будет обеспечить доступность конкретной базы данных, а также самой службы SQL Server. Я использую функцию, аналогичную следующей:

public class DbStatus
{
    public static bool DbOnline()
    {
        const int MaxRetries = 10;
        int count = 0;

        while (count < MaxRetries)
        {
            try
            {
                // Just access the database. any cheap query is ok since we don't care about the result.
                return true;
            }
            catch (Exception ex)
            {
                Thread.Sleep(30000);
                count++;
            }
        }
        return false;
    }
}
1

Как говорили другие, вы должны использовать ServiceInstaller Class, но вам не нужен полный проект установки. Вы можете быстро выполнить установку с помощью InstallUtil.exe, утилиты командной строки, которая поставляется с .NET Framework.

1

Вам нужно указать зависимости. Вы можете сделать это в своем классе Installer.

Дальнейшее уточнение

Для установки службы вы должны использовать класс установщика как пользовательское действие в своем проекте установки. Если вы этого не сделаете, опубликуйте комментарий, и я обновлю этот ответ с инструкциями о том, как это сделать.

Внутри конструктора для вашего класса Installer вы должны увидеть два компонента: serviceInstaller и serviceProcessInstaller. Я не помню, с какой высоты, но у одного из них есть свойство, которое позволяет указать многострочную строку, в которой перечислены имена служб ваших зависимостей службы.

  • 0
    Не могли бы вы уточнить, что вы имеете в виду? Как это поможет мне? Спасибо
  • 0
    При установке службы с помощью класса ServiceInstaller ( msdn.microsoft.com/en-us/library/… ) вы можете добавлять зависимости, используя свойство ServicesDependedOn.
0

У вас есть контроль над другими службами? Если да, они начнут вас, если нет, я думаю, вы все равно должны начать и следить за тем, что происходит. Можно зарегистрировать себя в WMI, чтобы получить уведомление, когда запускаются другие процессы - есть вопрос об этом.

  • 0
    Существует способ указать зависимости службы для окон, поэтому он не пытается запустить службу, пока другие службы не завершат запуск.
  • 0
    Это верно, однако это не поможет вам, если вы хотите, чтобы ваша служба запускалась только тогда, когда другие службы уже запущены - и я думаю, что это был вопрос.
Показать ещё 1 комментарий
0

В своем сервисном проекте добавьте установщик проекта как описано здесь. Одним из свойств вашего ProjectInstaller будет ServicesDependedOn. Когда вы добавляете сервисы к этому массиву строк (вы можете сделать это через IDE), они должны быть запущены до запуска вашей службы. Если они не запущены, SCM попытается их запустить.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню