如何在ASP.NET中优化后台运行线程的性能?

如何在ASP.NET中优化后台运行线程的性能?,.net,asp.net,multithreading,.net-3.5,.net,Asp.net,Multithreading,.net 3.5,在我的网站上,我使用线程在后台执行一个重复的过程。现在,更新数据库的过程大约需要30到45秒 该功能基本上执行以下功能: 1) 从网站下载CSV 2) 解析CSV并更新数据库表 我希望优化性能,并将所需时间减少到15秒 我该怎么做 编辑: 代码如下: // MAIN FUNCTION IN THE THREAD private static void downloadAndParse() { NewHive.MyServ n

在我的网站上,我使用线程在后台执行一个重复的过程。现在,更新数据库的过程大约需要30到45秒

该功能基本上执行以下功能:

1) 从网站下载CSV

2) 解析CSV并更新数据库表

我希望优化性能,并将所需时间减少到15秒

我该怎么做

编辑:

代码如下:

        // MAIN FUNCTION IN THE THREAD
        private static void downloadAndParse()
        {
            NewHive.MyServ newServe = new NewHive.MyServ();
            NewHive.CsvDownload newService = new NewHive.CsvDownload();
            //NewHive.MyServ newServe = new NewHive.MyServ();
            string downloadSuccess = newService.CsvDownloader();
            if (downloadSuccess == "Success")
            {
                string parseSuccess = newService.CsvParser();

            }
            newServe.updateOthersInPosition();
        }







     //CSV DOWNLOAD FUNCTION
    public string CsvDownloader()
    {
        Byte[] inBuf = null;
       // HttpWebRequest wr = Convert.ChangeType(WebRequestFactory.Create("http://finance.yahoo.com/d/quotes.csv?s=RHT+MSFT&f=sb2b3jk"),HttpWebRequest);
       // HttpWebResponse ws = Convert.ChangeType(wr.GetResponse(),HttpWebResponse);

        HttpWebRequest wr = (HttpWebRequest)WebRequest.Create("http://download.finance.yahoo.com/d/quotes.csv?s=INDU+INDU+^N225+^GSPC+^GDAXI+^FCHI+^HSI+^IXIC+^STOXX50E+^FTSE&f=l1bd14na");
        HttpWebResponse ws = (HttpWebResponse)wr.GetResponse();
        Stream str = ws.GetResponseStream();
        inBuf = new Byte[100000000];
        int bytesToRead = (int)inBuf.Length;

        int bytesRead=0;
        while(bytesToRead>0)
        {
            int n = str.Read(inBuf,bytesRead,bytesToRead);
            if(n==0)
            {
                break;
            }
            bytesRead += n;
            bytesToRead -= n;
        }
        FileStream fstr = new FileStream("D:\\Hosting\\7312812\\html\\News.csv", FileMode.Create, FileAccess.Write);


        //  FileStream fstr = new FileStream("News.csv", FileMode.Create, FileAccess.Write);
       // FileStream fstr = new FileStream("C:\\VSS Working Folder\\27 Jan 11 NewHive\\NewHive\\CSV\\new.csv", FileMode.Create, FileAccess.Write);
        fstr.Write(inBuf,0,bytesRead);
        str.Close();
        fstr.Close();

        return "Success";
    }







     //CSV PARSER FUNCTION
   public string CsvParser()
    {
       int _nNrRowsProccessed = 0;

       string connectionString = @"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + ConfigurationManager.AppSettings["CSVFolder"] + ";";

    OdbcConnection conn = new OdbcConnection(connectionString);

    try
    {
        conn.Open();

        string strFileName = ConfigurationManager.AppSettings["CSVFile"];
        string strSQL = "Select * from " + strFileName;

        OdbcCommand cmd = new OdbcCommand();
        cmd.Connection = conn;
        cmd.CommandText = strSQL;
        cmd.CommandType = CommandType.Text;

        OdbcDataReader reader = cmd.ExecuteReader();

        NewHive.MyServ newService = new NewHive.MyServ();
       // MasterCalendar_DB.OpenMySQLConnection();

        while (reader.Read())
        {
            decimal LastTradePrice;
            decimal Bid;
            string MarketOpen;
            string IndexCode;
            string Index;
            decimal Offer;
            decimal LTPDatabase=0.1M;

                IndexCode = reader[3].ToString();
                String addSQL = "Select LastTradePrice from `jsontest`.`tbl_MarketData` where IndexCode = '" + IndexCode + "'";
                MySqlConnection objMyCon = new MySqlConnection(strProvider);
                objMyCon.Open();
                MySqlCommand command = objMyCon.CreateCommand();

                command.CommandText = addSQL;
                MySqlDataReader result = command.ExecuteReader();
                //int j = command.ExecuteNonQuery();
                while (result.Read())
                {
                    LTPDatabase = Convert.ToDecimal(result[0]);
                  //  LTPDatabase = Math.Round(LTPTemp, 2);
                }
                objMyCon.Close();
                decimal LTPTemp =  Convert.ToDecimal(reader[0].ToString());
                LastTradePrice = Math.Round(LTPTemp, 2);
                if (reader[1].ToString() != "N/A")
                {
                    Bid = Convert.ToDecimal(reader[1].ToString());
                }
                else
                {
                    Bid = 10.0M;
                }
                if (LastTradePrice != LTPDatabase)
                {
                    MarketOpen = "Open";
                }
                else
                {
                    MarketOpen = "Close";
                }
                Index = reader[4].ToString();

                if (reader[5].ToString() != "N/A")
                {
                    Offer = Convert.ToDecimal(reader[5].ToString());
                }
                else
                {
                    Offer = 20.0M;
                }
            //}
           // string[] arLine = strLine.Split(';');

           // string strAgencyPropertyID = arLine[0];
           // DateTime dt = DateTime.Parse(arLine[1]);
          //  Int64 nDate = (Int64)Util.ConvertToUnixTimestamp(dt);
           // String strAvailability = (arLine[2]);

            _nNrRowsProccessed++;

            newService.CSVInsert(IndexCode,Index,MarketOpen,Bid,Offer,LastTradePrice);
          //  MasterCalendar_DB.Insert(strAgencyPropertyID, nDate, strAvailability);
        }           

    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        conn.Close();
       // MasterCalendar_DB.CloseMySQLConnection();
    }
    return "Success";
    }
}

您的代码有很多错误:

  • 您有各种各样的对象实现了
    IDisposable
    ,并且您没有使用
    块将它们放入
    。比如说,

    OdbcDataReader=cmd.ExecuteReader()

应该是

using (OdbcDataReader reader = cmd.ExecuteReader())
{
    // ...
}
  • 不要捕获无法处理的异常

您可能应该从分析开始,以确定哪个方面花费的时间最多。。。然后集中精力?如果没有任何代码或更多细节,这个问题无法回答。您是否获得了三个主要流程(文件传输、解析算法、数据访问)的相对计时指标,以确定瓶颈?您用于下载和解析csv的算法/代码是什么?哪一步需要更多的时间?我要做的第一件事是从ASP.NET应用程序中删除该后台线程。它不属于那里。@John Rasch:我已经编辑了我的问题,并添加了我的主函数和被调用的函数来下载和解析这些函数。2。不要在查询中使用字符串生成。SQL注入错误,m'kay?MySqlDataReader result=command.ExecuteReader();而(result.Read(){LTPDatabase=Convert.ToDecimal(result[0]);}这段代码太傻了。循环通过结果集以获得单个值?从长远来看,您可能需要将这些代码排队,而不是使其同步。@约翰·桑德斯:我应该在
中使用(OdbcDataReader=cmd.ExecuteReader())
?@Sean:这个愚蠢代码的替代方案是什么
while(result.Read()){LTPDatabase=Convert.ToDecimal(result[0]);}
?@PARTH:使查询返回所需的记录。要么从x=y的表中选择id,要么从a=b的y中选择max(列),然后简单地运行ExecuteScalar以返回单个结果。要回答您对@John Saunders的问题,任何将使用读卡器的代码都应该在using块中,因为一旦块结束,读卡器将被销毁。