为存储过程调用实现线程池

时间:2013-04-11 17:18:55

标签: c# sql-server multithreading stored-procedures

首先,让我先说我是C#初学者。我的背景主要是数据库。我正在开发一个项目,经常调用C#服务器,然后调用各种存储过程(大约20个左右)从SQL Server DB中检索数据。现在,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;
     } 
    

1 个答案:

答案 0 :(得分:0)

如评论中所述,您应该使用.NET ThreadPool而不是实现自己的。更好的是,使用较新的.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();
}