-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

您犯了两个错误:-您忘记启动线程(如任何答案所述)-您使用的是封闭值。这种不好的行为,因为线程函数会接收到错误的行。请参阅:http: //blogs.msdn.com/b/ericlippert/archive/2009/11/12/closure-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 回答
1

您还需要通过调用 myThread.Start(); 来启动线程。

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

当一个线程被构建时,它最初并没有运行;您需要使用 Thread.Start 方法显式执行此操作。这使您可以更好地控制线程何时开始执行。

编辑:固定为使用封闭值。

于 2013-05-24T13:24:34.487 回答
0

1:为什么要为找到的每个数据行启动一个线程?
2:要在代码中启动线程,您需要添加以下代码行

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