我使用下面的代码从线程函数调用方法。它不工作。请帮我这样做。
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
}
答案 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();