我的項目在c#中編寫了一個小型Windows服務來啓動我們服務器上的幾個進程。 我們的新服務取決於MSSQLSERVER服務,並且在用戶會話中進行操作時可以可靠地啓動/運行/停止。Try/Catch中包含ExecuteReader使其成功?
儘管在啓動時,我們的性能有限的硬件非常繁忙,看起來儘管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本身中放置方法調用一樣,影響了它成功的可能性。
任何想法最受歡迎。
如何找出問題所在,然後解決它?怎麼樣'try {executeReader();} catch(Exception ex){EventLog.WriteEntry(ex.ToString());}'? –
當它「失敗」時,你會得到什麼例外? –
只是猜測,但原因可以是.NET的性能優化請參見:[http://msmvps.com/blogs/peterritchie/archive/2007/06/22/performance-implications-of-try-catch-finally。 aspx](http://msmvps.com/blogs/peterritchie/archive/2007/06/22/performance-implications-of-try-catch-finally.aspx) – Ondra