Я пишу службу Windows, которая полагается на другие службы, как мне ждать, пока начнут работать другие службы?
Спасибо
Я думаю, вы стремитесь к этой строке
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);
}
}
удача
В дополнение к тому, что другие ответы указали 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;
}
}
Как говорили другие, вы должны использовать ServiceInstaller Class, но вам не нужен полный проект установки. Вы можете быстро выполнить установку с помощью InstallUtil.exe, утилиты командной строки, которая поставляется с .NET Framework.
Вам нужно указать зависимости. Вы можете сделать это в своем классе Installer.
Дальнейшее уточнение
Для установки службы вы должны использовать класс установщика как пользовательское действие в своем проекте установки. Если вы этого не сделаете, опубликуйте комментарий, и я обновлю этот ответ с инструкциями о том, как это сделать.
Внутри конструктора для вашего класса Installer вы должны увидеть два компонента: serviceInstaller и serviceProcessInstaller. Я не помню, с какой высоты, но у одного из них есть свойство, которое позволяет указать многострочную строку, в которой перечислены имена служб ваших зависимостей службы.
У вас есть контроль над другими службами? Если да, они начнут вас, если нет, я думаю, вы все равно должны начать и следить за тем, что происходит. Можно зарегистрировать себя в WMI, чтобы получить уведомление, когда запускаются другие процессы - есть вопрос об этом.
В своем сервисном проекте добавьте установщик проекта как описано здесь. Одним из свойств вашего ProjectInstaller будет ServicesDependedOn. Когда вы добавляете сервисы к этому массиву строк (вы можете сделать это через IDE), они должны быть запущены до запуска вашей службы. Если они не запущены, SCM попытается их запустить.