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