C # Ожидание запуска других служб - PullRequest
2 голосов
/ 19 июня 2009

Я пишу службу Windows, которая зависит от других служб. Как мне ждать запуска других служб?

Спасибо

Ответы [ 6 ]

3 голосов
/ 19 июня 2009

В дополнение к тому, что уже было указано в других ответах, если одной из этих служб является 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;
    }
}
3 голосов
/ 19 июня 2009

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

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

удачи

1 голос
/ 20 августа 2009

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

1 голос
/ 19 июня 2009

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

Дополнительные разъяснения

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

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

0 голосов
/ 19 июня 2009

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

0 голосов
/ 19 июня 2009

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

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