从线程调用函数

时间:2013-05-24 13:21:27

标签: c# asp.net multithreading

我使用下面的代码从线程函数调用方法。它不工作。请帮我这样做。

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 
}

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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方法显式执行此操作。这使您可以更好地控制线程何时开始执行。

编辑:已修复以使用已结算的值。

答案 2 :(得分:0)

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

 ....
 ....
 ThreadStart newThread = new ThreadStart(delegate { get_Data(dr); });
 Thread myThread = new Thread(newThread);
 myThread.Start();