Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将ExecuteReader包含在Try/Catch中可以使其成功吗?_C#_Windows_Service_Sqlcommand - Fatal编程技术网

C# 将ExecuteReader包含在Try/Catch中可以使其成功吗?

C# 将ExecuteReader包含在Try/Catch中可以使其成功吗?,c#,windows,service,sqlcommand,C#,Windows,Service,Sqlcommand,我的项目用c#编写了一个小型Windows服务,在我们的服务器上启动几个进程。 我们的新服务依赖于MSSQLSERVER服务,在用户会话中可靠地启动/运行/停止 不过,在启动时,我们有限的性能硬件非常繁忙,尽管MSSQLSERVER已向服务控制管理器报告为“已启动”,但它还没有完全准备好为查询提供服务。因此,尽管当我们打开SQLConnection时它成功了,但是第一次尝试查询“有时”(大约50/50)失败了 我(坦率地说)解决这个问题的方法是采用ExecuteReader方法,我认为这是失败的

我的项目用c#编写了一个小型Windows服务,在我们的服务器上启动几个进程。 我们的新服务依赖于MSSQLSERVER服务,在用户会话中可靠地启动/运行/停止

不过,在启动时,我们有限的性能硬件非常繁忙,尽管MSSQLSERVER已向服务控制管理器报告为“已启动”,但它还没有完全准备好为查询提供服务。因此,尽管当我们打开SQLConnection时它成功了,但是第一次尝试查询“有时”(大约50/50)失败了

我(坦率地说)解决这个问题的方法是采用ExecuteReader方法,我认为这是失败的:

rdr = cmd.ExecuteReader();
并将其放置在具有1s延迟的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; 
        }
bool bReady=false;
int iErrCount=0;
while(bReady==false&&iercount<10)
{
尝试
{
系统线程线程睡眠(1000);
rdr=cmd.ExecuteReader();
bReady=true;
WriteEntry(“启动…”,EventLogEntryType.Information);
}
抓住
{
bReady=false;
iErrCount+=1;
EventLog.WriteEntry(“失败一次…”,EventLogEntryType.Warning);
}
}
if(bReady==false)
{
WriteEntry(“失败十次。服务现在将退出。”,EventLogEntryType.Error);
返回;
}
我的看法是,尽管这种方法工作得很好,每次都允许服务启动,但如果我检查事件日志,它实际上总是在第一次尝试时成功!我现在试图抓住的例外从未发生过。 这就好像把方法调用放在Try/Catch本身中影响了它成功的可能性


欢迎任何想法。

确定没有添加线程。以前没有的睡眠

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

如果以前没有,那么现在您在尝试打开连接之前先睡一会儿。也许这就是你所需要的。

找出问题所在,然后解决它怎么样?如何
尝试{executeReader();}catch(异常ex){EventLog.WriteEntry(ex.ToString());}
?当它“失败”时,会出现什么异常?只是猜测,但原因可能是.NET的性能优化。请看这里:谢谢大家。一些有趣的事情值得一看。在我们的测试环境中进行构建需要一段时间,但我会在更接近问题的时候进行更新。约翰:我的问题是,当我尝试/捕捉时,我从未捕捉到异常。Eren:当它失败时,它是一个关于数据库仍在恢复的SQLException(这是半预期的!?!),Ondra:谢谢,真的很有趣。谢谢Jorge。我还没能像医生一样测试那么多。在我们的测试环境中进行构建需要时间,b)。唯一实用的测试方法是完全重新启动服务器,这也需要时间,但有限的测试表明,即使没有1s睡眠,也只需将命令放在Try/Catch中即可使其工作。