我正在编写依赖其他服务的Windows服务,我该如何等待其他服务启动?
由于
答案 0 :(得分:3)
我认为你应该这一行
installer.ServicesDependedOn = new string [] {“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 :(得分: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;
}
}
答案 2 :(得分:1)
您需要指定依赖项。您可以在安装程序类中执行此操作。
进一步澄清
您应该在安装项目中使用Installer类作为自定义操作来安装您的服务。如果您不是,请发表评论,我将更新此答案,并提供有关如何执行此操作的步骤。
在Installer类的设计器中,您应该看到两个组件:serviceInstaller和serviceProcessInstaller。我不记得我的头脑中哪一个,但其中一个有一个属性,允许您指定一个多行字符串,列出服务的依赖项的服务名称。
答案 3 :(得分:1)
正如其他人所说,你应该使用ServiceInstaller Class,但你不需要一个完整的设置项目。 您可以使用InstallUtil.exe快速安装,这是.NET Framework附带的命令行实用程序。
答案 4 :(得分:0)
您是否可以控制其他服务? 如果有,他们会启动你,如果没有,我想你必须开始,并监视自己发生了什么。 可以使用WMI注册自己以在其他进程启动时获得通知 - 有一个问题。
答案 5 :(得分:0)
在您的服务项目中,添加项目安装程序as described here。 ProjectInstaller的一个属性是ServicesDependedOn。当您向该字符串数组添加服务(您可以通过IDE执行此操作)时,将需要在服务启动之前启动它们。如果它们没有启动,SCM将尝试启动它们。