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」メソッド内で使用しているすべての変数は他のプロセスと共有できず、1 つのスレッドがすべてのロック変数を解放するのを待つことができないため、ここではロックを使用できません。

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 に答える