我有一个小问题,与此代码:参数过路线程C#ERROR
这是应用程序的“主”的方法:
private Thread main_process;
private Clases.GestorTR processor;
public void begin()
{
processor = new Clases.GestorTR();
main_process = new Thread(new ThreadStart(processor.ExecuteP));
main_process.Start();
}
我创建了一个线程来处理其他“Transacction Threads”避免阻塞GUI。 这是方法ExecuteP,处理器对象上:
public void ExecuteP()
{
// Readed an DataTable with BD transacction, filled with numbers
foreach (DataRow dr in dtResults.Rows)
{
int Local_number = Convert.toInt32(dr["autonum"].ToString());
ThreadStart starter;
starter = delegate { new QueryBD.QueryCounter(Local_number); };
new Thread(starter).Start();
}
}
这是QueryBD类的QueryCounter方法:
....
private void QueryCounter(int _counter)
{
logs.log("ON QUERY_PROCESS: " + _counter);
}
...
现在,问题。在调用委托时,一些线程正在穿越参数。例如,在foreach方法中,日志显示正确(1,2,3,4,5,6,7,8),但在QueryCounter方法中(每次调用新线程时,日志显示为1,1 ,1,4,5,6,6,8)例如,我也试过使用锁,但问题是一样的,同样使用ThreadPool方法测试,结果相同 我想我错过了东西在foreach循环,因为如果我调试首次运行时,线程启动,但没有在日志中动作
感谢!
嗨!我没有使用ParameterizedThreadStart来获得一个“更干净”的代码,并避免像字符串数组那样解析对象来获取所有参数,但是我错了。现在,我正在研究为什么ThreadPool和委托匿名方法不起作用,有什么想法? 关于锁,性能如何:USING LOCK with 1 base object VS.为每个线程提供一个新实例?思考速度,每次提供新实例并不是更快的方法? 非常感谢, – Jabab 2010-08-06 21:57:50
使用WS调用和BD访问的完整流程。速度和多个请求是一个 “必须”: 随着每次调用新的对象: START 16:00:08.8915628 FINISH 16:00:12.0278610 总时间:3.1362982 随着锁定和单碱基对象: START 16 :02:33.3375315 完成16:02:38.9863682 总时间:5.6488367 – Jabab 2010-08-06 22:12:49
嘿,检查编辑部分在我的答案。该评论部分是对此的简要介绍。保重。 – jwaliszko 2010-08-06 23:00:54