我有一个作为Windows服务运行的应用程序。它将各种设置存储在数据库中,在服务启动时查找这些设置。我构建了服务以支持各种类型的数据库(SQL Server,Oracle,MySQL等)。通常,最终用户选择将软件配置为使用SQL Server(他们可以使用连接字符串简单地修改配置文件并重新启动服务)。问题是,当他们的机器启动时,经常在我的服务之后启动SQL Server,因此我的服务在启动时出错,因为它无法连接到数据库。我知道我可以为我的服务指定依赖项,以帮助指导Windows服务管理器在我之前启动相应的服务。但是,我不知道在安装时(当我的服务注册时)要依赖哪些服务,因为用户可以在以后更改数据库。
所以我的问题是:用户是否有办法根据他们使用的数据库手动指示服务依赖项?如果没有,我应该采取什么样的正确设计方法?我已经考虑过尝试做一些事情,比如在服务启动之后等待30秒才连接到数据库,但由于各种原因,这看起来真的很不稳定。我也考虑过“懒洋洋地”连接到数据库;问题是我在启动时需要立即连接,因为数据库包含我的服务首次启动时需要的各种重要信息。有什么想法吗?
答案 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)
不能直接回答你可以研究一些观点
How to make Windows Service start as “Automatic (Delayed Start)”