C#等待其他服务启动

时间:2009-06-18 21:48:20

标签: c# windows

我正在编写依赖其他服务的Windows服务,我该如何等待其他服务启动?

由于

6 个答案:

答案 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将尝试启动它们。