2

我的项目用 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 本身中的某些事情影响了它成功的可能性。

欢迎任何想法。

4

1 回答 1

1

确定您没有添加以前不存在的 Thread.Sleep 吗?

System.Threading.Thread.Sleep(1000); 
rdr = cmd.ExecuteReader();

如果以前不存在,那么现在您在尝试打开连接之前要睡一秒钟。也许这就是你所需要的。

于 2012-11-13T15:10:18.230 回答