2012-01-17 79 views
0

我每10分鐘讀取MSSQL數據庫並處理數據&上傳從給定數據生成的XML文件。數據庫在公共領域每8分鐘更新一次。在每次定時器調用中,我們都會收到大約1050-2000條數據行。目前我使用C#Timer來獲取和更新並同步本地和遠程數據庫。有時下面的代碼無法響應並掛起。請提供以下替代方案或任何其他可以實時運行的邏輯。C#定時器讀取數據庫

代碼:

System.Timers.Timer Timer =null; 

    public void initModelViewer 
    { 
     Timer = new System.Timers.Timer(); 
     Timer.Interval = 1000*60*10; 
     Timer.Enabled = true;  
     Timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed); 
     Timer.Start(); 
    } 


    void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     try 
     { 
      lock (this) 
     { 
      #region GetCustIRDI 
      DataSet DsIRDIModel = DbManager.GetDatasetByCommand(cSQL.getIRDIInfo("SQL Command")); 
      //Process the information. 
      //update the client side application. 
      #endregion 

      #region GetCustIRDIXML 
      DataSet DsIRDIXMLModel = DbManager.GetDatasetByCommand(cSQL.getIRDIXML("SQL Command")); 

      //Generate and save the XML. Another app upload it 
      XMLAPPFabicModel FabricXML = new XMLAPPFabicModel(DsIRDIXMLModel, XMLSpecs.Limitation)); 

      //Fabric EventHandlers... 

      //Sync the local DBFabricModel and update main server 
      #endregion 
     } 
}catch(Exception ex){ 
//Error handling 
} 


    } 
+1

爲什麼不在處理完成後的預定義時間內使用'睡眠'的Windows服務。隨着你的定時方法,你可能會遇到併發問題。 – Kane 2012-01-17 11:01:38

+0

是的,你是對的,定時器啓用和禁用將解決我的問題,它會系統地工作,但我不能有任何延遲之間。有時系統等待15分鐘以上才能完成整個過程。後臺線程可以提供任何幫助嗎? – 2012-01-17 11:10:05

+0

您可以隨時使用TaskManager(4.0)或線程池來傳播工作負載,即垂直縮放。如果你想要水平縮放,那麼只需要幾臺機器都具有windows服務,但只能在一組預定義的記錄上運行。服務器A處理的記錄ID爲0到1000,服務器B處理記錄1001到2000等等。 – Kane 2012-01-17 11:16:34

回答

1

首先,因爲我知道,不要使用與 「this」 關鍵字同步。 相反,使用:

private readonly object _sync; 

其次,我不知道你的對象(XMLAPPFabicModel,DbManager),但如果你想調試它,你需要一個對象使用一個。

例如,在調試方案1僅使用

  DataSet DsIRDIModel = DbManager.GetDatasetByCommand(cSQL.getIRDIInfo("SQL Command")); 

在唯一的方案2使用:

XMLAPPFabicModel FabricXML = new XMLAPPFabicModel(DsIRDIXMLModel, XMLSpecs.Limitation)); 

一些DsIRDIXMLModel對象。

三,爲什麼你需要DsIRDIModel對象?