C#在Timer上读取数据库

时间:2012-01-17 10:59:06

标签: c# .net sql visual-studio timer

我每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 个答案:

答案 0 :(得分: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对象?