2012-05-23 71 views
0

我有下面的代碼運行以啓動我的表計算(表計算引發了幾個查詢返回數千行)。當我的應用程序運行一個實例時,事情很好,但是2個或更多,然後服務器變慢,我開始出錯。在C中的多線程進程#

我應該把這段代碼變成線程嗎?這是如何完成的?

private static object _lock = new object(); 

private void RunTable(string outputType, string _outputDataType) { 

     Server.ScriptTimeout = 300; 

     string returnCode = string.Empty; 
     lock (_lock) 
     { 
      using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["MainDll"].ToString())) 
      { 
       connection.Open(); 
       using (SqlCommand command = new SqlCommand(sql.ToString(), connection)) 
       { 
        command.CommandType = CommandType.Text; 
        command.CommandTimeout = 300; 
        returnCode = (string)command.ExecuteScalar(); 
        Dispose(); 
       } 
       Dispose(); 
      } 
     } 
+2

首先:如果您看到錯誤,請告訴我們您看到的錯誤。第二:你讀的數據量是多少(即你可以將所有數據加載到RAM中)? – Kiril

+3

對於快速,簡單和高效的多線程,您可以使用BackgroundWorker類http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx,但我的猜測是,您可能會遇到一些問題用你查詢數據庫的方式,或者你需要一些SQL調優。 –

+1

當你說「一個實例/兩個實例」時,你的意思是進程或線程? – eyossi

回答

1

首先:如果您看到錯誤,請告訴我們您看到的錯誤。

第二:您讀取了多少數據(即您可以將所有數據加載到RAM中)?

第三:如果無法一次加載所有數據,請嘗試使用SqlDataReader從數據庫中連續讀取數據。

關於多線程:它真的取決於你的瓶頸在哪裏。如果你的瓶頸是從數據庫中讀取數據,那麼通過多線程處理你不會獲得太多的收益(特別是如果你的數據庫不允許併發訪問)。您可以使用線程處理數據,一旦從數據庫中獲取數據,並且在您按照記錄讀取記錄時必須使用SqlDataReader時效果尤佳。

+0

錯誤已完全列在另一張票中,如上面的註釋中所示 – cdub

+0

確定,所以有人已經在這裏回答你的問題:http://stackoverflow.com/questions/10712055/sql-server-and-net-memory-constraints-allocations-and-garbage-collection你發佈多少次?有另一種方法,獲取'SqlDataReader',並保持它打開...解決這個問題,讓我們知道如果它變得更好。 – Kiril

+0

我有SqlDataReader閱讀器,它的工作原理,但我做reader.Close()後ALL他們仍然ge那個錯誤。它與多進程的東西,而不是處理內存 – cdub