我的项目用 c# 编写了一个小型 Windows 服务来在我们的服务器上启动几个进程。我们的新服务依赖于 MSSQLSERVER 服务,并且在从用户会话中操作时可靠地启动/运行/停止。
不过,在启动时,我们性能有限的硬件非常繁忙,看起来虽然 MSSQLSERVER 已向服务控制管理器报告“已启动”,但它还没有完全准备好为查询提供服务。因此,尽管当我们打开 SQLConnection 成功时,第一次尝试查询“有时”(大约 50/50)失败。
我(诚然直率)解决此问题的方法是采用我认为失败的 ExecuteReader 方法:
rdr = cmd.ExecuteReader();
并将其放入延迟为 1 秒的 Try/Catch 中,并让它重试最多 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 本身中的某些事情影响了它成功的可能性。
欢迎任何想法。