2012-11-13 51 views
2

我的項目在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本身中放置方法調用一樣,影響了它成功的可能性。

任何想法最受歡迎。

+2

如何找出問題所在,然後解決它?怎麼樣'try {executeReader();} catch(Exception ex){EventLog.WriteEntry(ex.ToString());}'? –

+0

當它「失敗」時,你會得到什麼例外? –

+0

只是猜測,但原因可以是.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

回答

1

當然,你沒有添加一個以前沒有的Thread.Sleep?

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

如果那之前沒有,現在您在嘗試打開連接前睡了一秒鐘。也許這就是你需要的一切。

+0

謝謝豪爾赫。我沒有能夠像我想的那樣多測試)。需要一段時間才能讓構建進入我們的測試環境,b)。唯一可行的測試方法是完全重啓服務器,這也需要時間,但即使沒有1s睡眠,有限的測試也會顯示出來,只需將命令放入Try/Catch即可。 – dameslap