我的项目在c#中编写了一个小型Windows服务,以便在我们的服务器上启动几个进程。 我们的新服务取决于MSSQLSERVER服务,并在用户会话中操作时可靠地启动/运行/停止。
在启动时,我们的性能有限的硬件非常繁忙,虽然MSSQLSERVER已经向服务控制管理器报告为“已启动”,但它还没有为服务查询提供服务。因此,虽然当我们打开我们的SQLConnection它成功时,第一次尝试查询“有时”(大约50/50)失败。
我的(诚然是直率的)解决这个问题的方法是采用我认为失败的ExecuteReader方法:
rdr = cmd.ExecuteReader();
将其放入Try / Catch中,延迟时间为1秒,然后重试最多10次:
bool bReady = false;
int iErrCount = 0;
while (bReady == false && iErrCount < 10)
{
try
{
System.Threading.Thread.Sleep(1000);
rdr = cmd.ExecuteReader();
bReady = true;
EventLog.WriteEntry("Starting...",EventLogEntryType.Information);
}
catch
{
bReady = false;
iErrCount += 1;
EventLog.WriteEntry("Failed once...",EventLogEntryType.Warning);
}
}
if (bReady == false)
{
EventLog.WriteEntry("Failed ten times. Service will now exit.",EventLogEntryType.Error);
return;
}
我的问题是,尽管这种方法运行良好并允许服务每次启动,但如果我检查事件日志,它实际上总是在第一次尝试成功!我现在试图抓住的例外从未发生过。 这就好像将方法调用放在Try / Catch本身一样,影响了它成功的可能性。
欢迎任何想法。
答案 0 :(得分:1)
当然你没有添加之前没有的Thread.Sleep吗?
System.Threading.Thread.Sleep(1000);
rdr = cmd.ExecuteReader();
如果之前没有,那么现在你在尝试打开连接之前已经睡了一秒钟。也许这就是你所需要的一切。