2012-01-17 14 views
0

私は10分ごとにMSSQLデータベースを読んで、与えられたデータから生成されたXMLファイルをアップロードする&のデータを処理しています。データベースはパブリックドメインで8分ごとに更新されます。すべてのタイマーコールで約1050〜2000のデータ行が受信されます。私は現在、C#Timerを使用して、ローカルデータベースとリモートデータベースの両方を取得および更新して同期しています。次のコードが応答しなくなり、その間にハングインすることがあります。リアルタイムでうまくいく以下のロジックやその他のロジックの代替を提供してください。タイマーでデータベースを読み込む

コード:

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

+0

はい、あなたは正しいです、タイマーの有効化と無効化は私の問題を解決し、体系的に動作しますが、私は間に遅延を持つことはできません。プロセス全体を終了するためにシステムが15分以上待つことがあります。バックグラウンドスレッドは何か助けになるでしょうか? –

+0

タスクマネージャ(4.0)またはスレッドプールを使用して、作業負荷を分散させることができます。水平方向の拡大縮小が必要な場合は、すべてがWindowsサービスを持ち、事前定義されたレコードセットでのみ動作する複数のマシンを持つだけです。サーバーAプロセスはレコードIDが0〜1000のサーバーBがレコード1001〜2000などを処理します。 – Kane

答えて

1

まず、私が知っているように、 "この" キーワードとの同期は使用しないでください。代わりに、使用の :

private readonly object _sync; 

第二には、私はあなたのオブジェクト(XMLAPPFabicModel、DBManagerのを)知らないが、あなたはそれをデバッグしたい場合、あなたは1つのオブジェクトによっていずれかを使用する必要があります。例えば、デバッグシナリオ1使用中のみ

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

シナリオ2使用において

のみ:

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

一部DsIRDIXMLModelオブジェクトと。

第3に、なぜDsIRDIModelオブジェクトが必要ですか?

関連する問題