2013-04-11 74 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(); 
}