-1

以下のコードを使用して、スレッド関数からメソッドを呼び出しています。機能していません。これを行うのを手伝ってください。

DataTable dt = get_data(Convert.ToInt32(Start_From), Convert.ToInt32(End_To));
foreach (DataRow dr in dt.Rows)
{
  ThreadStart newThread = new ThreadStart(delegate { insert_Data(dr); });
  Thread myThread = new Thread(newThread);
}

public static DataTable get_Data(int form,int to)
{
   .....
   return Dt;
}

[MTAThread]
public static string insert_Data(DataRow dr)
{
 .....SOme code here //This funcion not call 
}
4

3 に答える 3

2

あなたは2つの間違いを犯しました:-スレッドを開始するのを忘れました(回答で述べたように)-閉じた値を使用しています。スレッド関数が間違った行を受け取るため、この悪い動作です。参照: http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx

これを試して:

foreach (DataRow dr in dt.Rows)
{
    DataRow localRow = dr;
    ThreadStart newThread = new ThreadStart(delegate { insert_Data(localRow); });
    Thread myThread = new Thread(newThread);
    myThread.Start();
}

小さな操作のためにスレッドを作成することはお勧めできません。パフォーマンスのために、スレッドプールを使用してみてください。

foreach (DataRow dr in dt.Rows)
{
    Action<DataRow> action = (row) => insert_Data(row);
    action.BeginInvoke(dr, null, null);
}

別の解決策は、PLINQ を使用することです。

Parallel.ForEach(dt.AsEnumerable(), dr => insert_Data(dr));
于 2013-05-24T13:29:32.553 に答える
0

1: 見つけたデータ行ごとにスレッドを開始する必要があるのはなぜですか?
2: コードでスレッドを開始するには、次のコード行を追加する必要があります

 ....
 ....
 ThreadStart newThread = new ThreadStart(delegate { get_Data(dr); });
 Thread myThread = new Thread(newThread);
 myThread.Start();
于 2013-05-24T13:35:49.697 に答える