选择“使用不同线程从 SQL Server 中的记录”

本文关键字:Server SQL 记录 线程 选择 | 更新日期: 2023-09-27 18:33:48

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

例如

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"方法中使用的所有变量都无法与其他进程共享,并且无法等待一个线程释放所有锁定变量。

选择“使用不同线程从 SQL Server 中的记录”

我不知道您的业务需求,但为每一行生成一个线程似乎有点过分了。但是,如果您要这样做,请至少将管理线程池留给 .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 中完成其工作