在Try / Catch中包含ExecuteReader会使它成功吗?

时间:2012-11-13 15:00:12

标签: c# windows service sqlcommand

我的项目在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本身一样,影响了它成功的可能性。

欢迎任何想法。

1 个答案:

答案 0 :(得分:1)

当然你没有添加之前没有的Thread.Sleep吗?

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

如果之前没有,那么现在你在尝试打开连接之前已经睡了一秒钟。也许这就是你所需要的一切。