安装后设置服务依赖项

时间:2010-05-17 16:08:53

标签: c# database windows-services

我有一个作为Windows服务运行的应用程序。它将各种设置存储在数据库中,在服务启动时查找这些设置。我构建了服务以支持各种类型的数据库(SQL Server,Oracle,MySQL等)。通常,最终用户选择将软件配置为使用SQL Server(他们可以使用连接字符串简单地修改配置文件并重新启动服务)。问题是,当他们的机器启动时,经常在我的服务之后启动SQL Server,因此我的服务在启动时出错,因为它无法连接到数据库。我知道我可以为我的服务指定依赖项,以帮助指导Windows服务管理器在我之前启动相应的服务。但是,我不知道在安装时(当我的服务注册时)要依赖哪些服务,因为用户可以在以后更改数据库。

所以我的问题是:用户是否有办法根据他们使用的数据库手动指示服务依赖项?如果没有,我应该采取什么样的正确设计方法?我已经考虑过尝试做一些事情,比如在服务启动之后等待30秒才连接到数据库,但由于各种原因,这看起来真的很不稳定。我也考虑过“懒洋洋地”连接到数据库;问题是我在启动时需要立即连接,因为数据库包含我的服务首次启动时需要的各种重要信息。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

丹尼斯    你在找什么是SC.exe。这是一个命令行工具,用户可以使用它来配置服务。

sc [Servername] Command Servicename [Optionname= Optionvalue...]

更具体地说,你想要使用

sc [ServerName] config ServiceName depend=servicetoDependOn

这是SC.EXE的commandlike选项的链接 http://msdn.microsoft.com/en-us/library/ms810435.aspx

答案 1 :(得分:1)

可能的(远非理想的)代码解决方案:

在启动方法中将其编码为一个循环,在您建立连接时终止。然后在该循​​环中捕获任何数据库连接错误并继续重试,如下面的伪代码所示:

bool connected = false;
while (!connected)
{
    try
    {
        connected = openDatabase(...);
    }
    catch (connection error)
    {
         // It might be worth waiting for some time here
    }
}

这意味着您的程序在连接之前不会继续。但是,它也可能意味着您的程序永远不会退出此循环,因此您需要某种方式来终止它 - 手动或在一定次数的尝试之后。

由于您需要在合理的时间内启动服务,因此此代码无法进入主要初始化阶段。您必须安排程序成功“启动”,但在此方法返回connected = true之前不要进行任何处理。您可以通过将此代码放在一个线程中然后在“thread completed”事件上启动您的实际应用程序代码来实现此目的。

答案 2 :(得分:0)

不能直接回答你可以研究一些观点

  1. Windows服务可以延迟自动启动。您可以在SO中查看此问题以获取有关它的一些信息。
  2. How to make Windows Service start as “Automatic (Delayed Start)”

    1. 查看此帖子How to: Code Service Dependencies