0

我创建了一个带有开始和结束索引的存储过程来获取中间的行

例如

Create Procedure ProcA
@StartIndex int,
@EndIndex int
As
Begin
Select * from Table A where Rowno between @StartIndex and @EndIndex
End

现在我需要同时使用多个线程从 C# 获取行,

这是我的代码,

public static DataTable ReadRecord(int startindex)
{
       SqlConnection SqlConn = new SqlConnection(Connectionstr);
       if (SqlConn.State == ConnectionState.Closed) 
       {
           SqlConn.Open();
       }
       DataTable Dt = new DataTable();
       SqlCommand SqlCmd = new SqlCommand("USP_InstinctBPDataTest", SqlConn);
       SqlCmd.CommandType = CommandType.StoredProcedure;

       SqlCmd.Parameters.AddWithValue("@SRow", startindex);
       SqlCmd.Parameters.AddWithValue("@ERow", startindex + 2499);

       SqlDataAdapter Da = new SqlDataAdapter();
       Da.SelectCommand = SqlCmd;
       Da.Fill(Dt);
       return Dt;
}

我尝试过创建多个线程,例如,

List<ThreadStart> threadStartsList = new List<ThreadStart>();


ThreadStart ts = delegate() { ReadRecord(1); };
threadStartsList.Add(ts);
ThreadStart ts1 = delegate() { ReadRecord(2501); };
threadStartsList.Add(ts1);


Thread[] tsarr = new Thread[2];
int i = 0;
foreach (ThreadStart tsl in threadStartsList)
{
    tsarr[i] = new Thread(tsl);
    tsarr[i].Start();
    i++;
}

for (int j = 0; j < tsarr.Length; j++)
{
    tsarr[j].Join();
}

我正在使用 .Net 框架 3.5。我需要同时运行线程并等待它完成进程。但是我得到关于连接池的异常在没有运行的情况下达到了最大值。

我不能在这里使用锁,因为我在“ReadRecord”方法中使用的所有变量都不能与其他进程共享,也不能等待一个线程释放所有锁变量。

4

1 回答 1

0

我不知道您的业务需求,但为每一行生成一个线程似乎有点过头了。但是,如果您要这样做,至少将管理线程池留给 .net。如果是服务器端代码,您可以使用 ThreadPool.QueueUserWorkItem

int toProcess = 10; //lets say you have 10 index
using(ManualResetEvent resetEvent = new ManualResetEvent(false))
{
    var list = new List<int>();
    for(int i=0;i<10;i++) list.Add(i); // your indexes [0..10]
    for(int i=0;i<10;i++)
    {
       //add each task to pool
        ThreadPool.QueueUserWorkItem(
           new WaitCallback(x => {
              ReadRecord(x)
              //when finished decrement count 
              if (Interlocked.Decrement(ref toProcess)==0)
                 resetEvent.Set();

           }),list[i]);
    } 

    //wait them to finish
    resetEvent.WaitOne();
}

等到所有线程完成它们在 ThreadPool 中的工作

于 2013-10-03T11:51:22.823 回答