2014-09-22 35 views
-1

我有一個Windows服務,做以下的事情:超時異常離開Windows服務反應遲鈍

  1. 連接到數據源的OnStart。
  2. 調用一種方法,每5秒從數據源獲取數據並將其保存到數據庫。
  3. 調用第三方Web服務以每5秒處理一次數據。

的設置:

兩個點2和3被稱爲在同一定時器的經過。有時,第三方Web服務會超時。在這種情況下,我們捕獲異常,將其記錄在我們的數據庫中,然後不要再拋出它。我們的想法是,當定時器再次過期時,我們想重新調用Web服務,因爲改進第三方服務不在我們的控制範圍內,並且在任何情況下都不會經常發生。下面是過程數據()的一些僞代碼:

private bool ProcessData() 
{ 
    bool hasBeenProcessed = false; 

    try 
    { 
     // Call web service 
     // If successful 
     hasBeenProcessed = true; 
    } 
    catch(Exception ex) 
    { 
     // Log exception 
    } 

    return hasBeenProcessed; 
} 

問題:

我們的windows服務完全停止工作,即使異常被處理,而不是重新拋出。忘記第3步,我們無法看到數據庫中的任何數據應該作爲第2步的一部分來完成。理想情況下,我們不希望數據收集因爲數據處理中的問題而受到影響。該服務本身在服務管理器中顯示爲正在運行。儘管從服務管理器停止服務不起作用。

問:

雖然我們現在分開這兩件事情分成兩個不同的服務,我試圖找出什麼地方出了錯在目前的邏輯是什麼?爲什麼Windows服務變得無法響應?

+0

其中是正在處理的異常可以廣告或顯示您正在執行的日誌邏輯..?基於你已經顯示你的方法調用的代碼什麼也不做 – MethodMan 2014-09-22 21:19:32

回答

0

一種可能性是查詢數據和調用帶有數據的Web服務花費的時間超過5秒,因此您的計時器事件開始彼此堆疊在一起。

在嘗試再次處理數據之前,請考慮使用變量來跟蹤是否正在處理數據。例如:

private bool _processingData = false; 

private void _timer_Elapsed(object sender, ElapsedEventArgs e) 
{  
    if (!_processingData) 
    { 
     _processingData = true; 

     QueryForData(); 
     ProcessData(); 

     _processingData = false; 
    } 
}