Form窗体中添加一个panel和一个button,下面是demo的代码(只能放图片,抱歉)。具体场景中,每一个控件创建比较耗时(大概在60毫秒左右)。
你代码写错了吧。
ThreadPool.....AddingControls(i)
这里最后进到委托方法不都是0 2000?
另一个if(this.InvokeRequired)
else呢?
是有错误,运行的话i都是2000
@FreeSaber:
for(...)
{
var tmp=i;
ThreadPool.Q.....(tmp);
}
@Daniel Cai: http://www.cnblogs.com/artech/archive/2009/05/22/1486761.html
哈哈,我也找到了,先试试有没有问题。
@FreeSaber: 而且你这里用线程池没太大意义吧。直接起一个线程循环一下就完了,你线程池最后还是要到ui线程上来添加控件。
@Daniel Cai: 演示里面一个线程就能跑完,项目里面不是button,是每个uc,uc的创建时间有点慢,而且高度必须实例化之后才能获取到。现在不知道怎么回事,代码都一样,到项目里面this.InvokeRequired的值一直都是false。
@FreeSaber:
var td=new Thread(_=>{
for(int i=0;i<2000;i++)
{
//...construct button
AddControl2(buttonInstance,c=>this.Controls.Add(c));
}
});
td.IsBackground=true;
td.Start();
void AddControl2(Control c,Action<Control> action)
{
if(InvokeRequired)
{
Invoke(new Action(()=>action(c));
}
else
action(c);
}
闭包,ThreadPool.QueueUserWorkItem(obj => AddingControls((int)obj), i);