选择“使用不同线程从 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"方法中使用的所有变量都无法与其他进程共享,并且无法等待一个线程释放所有锁定变量。
我不知道您的业务需求,但为每一行生成一个线程似乎有点过分了。但是,如果您要这样做,请至少将管理线程池留给 .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 中完成其工作