2013-04-11 59 views
3

首先,讓我開始說我是C#初學者。我的背景主要是數據庫。我正在開發一個項目,其中會頻繁調用C#服務器,然後調用各種存儲過程(大約20個左右)從SQL Server數據庫中檢索數據。現在,C#服務器被設置爲進行同步調用。雖然SP調用很快且很小,但我們仍然希望實現一個線程池來處理大量用戶和同時請求。爲存儲過程調用實現線程池

我的問題:

  1. 如何實現線程池?線程池最有可能從500開始,但可能會隨應用程序的使用而增長。

  2. 如何將SP調用添加到線程池。現在我的電話SP看起來像這樣:

    int SPCall(string param1, string param2) 
    { 
        string MyConnString = "..."; 
        SqlConnection MyConn = new SqlConnection(MyConnString); 
        MyConn.Open(); 
        SqlCommand SPCommand = new SqlCommand("wh_SP"); 
        SPCommand.Connection = MyConn; 
        SPCommand.Parameters.Add(...) = param1; 
        SPCommand.Parameters.Add(...) = param2; 
    
        SPCommand.CommandType = System.Data.CommandType.StoredProcedure; 
        SPCommand.ExecuteNonQuery(); 
        int outPut = (int)SPCommand.Parameters["@OUTPUT"].Value; 
        return outPut; 
    } 
    
+3

不要滾動自己的線程池 - 使用[內置](http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx)之一。有關於如何排隊工作項目的文檔。 – 2013-04-11 17:29:30

回答

0

正如在評論中提到,你應該使用.NET線程池,而不是實現自己的。更好的是,使用更新的.NET Parallel library,並將每個這些輸出到一個任務中。您將更好地控制如何使用相對較少的代碼處理併發。

public void PerformWork() 
{ 
    // setup your inputs 
    IEnumerable<string> inputs = CreateYourInputList(); 

    // Method signature: Parallel.ForEach(IEnumerable<TSource> source, Action<TSource> body) 
    Parallel.ForEach(inputs, input => 
     { 
      // call your code that issues the stored procedure here 
      this.SPCall(input); 
     } //close lambda expression 
    ); //close method invocation 

    // Keep the console window open in debug mode. 
    Console.WriteLine("Processing complete. Press any key to exit."); 
    Console.ReadKey(); 
}