首页 新闻 搜索 专区 学院

线程池创建控件,添加到主线程池UI中?

0
悬赏园豆:100 [已解决问题] 解决于 2016-12-20 14:55

Form窗体中添加一个panel和一个button,下面是demo的代码(只能放图片,抱歉)。具体场景中,每一个控件创建比较耗时(大概在60毫秒左右)。

FreeSaber的主页 FreeSaber | 初学一级 | 园豆:85
提问于:2016-11-21 14:04
< >
分享
最佳答案
0

你代码写错了吧。

ThreadPool.....AddingControls(i)

这里最后进到委托方法不都是0 2000?

另一个if(this.InvokeRequired)

else呢?

 

 

 

收获园豆:80
Daniel Cai | 专家六级 |园豆:10374 | 2016-11-21 14:08

是有错误,运行的话i都是2000

FreeSaber | 园豆:85 (初学一级) | 2016-11-21 14:12

@FreeSaber: 

for(...)

{

 var tmp=i;

ThreadPool.Q.....(tmp);

}

Daniel Cai | 园豆:10374 (专家六级) | 2016-11-21 14:16

@Daniel Cai: http://www.cnblogs.com/artech/archive/2009/05/22/1486761.html

哈哈,我也找到了,先试试有没有问题。

FreeSaber | 园豆:85 (初学一级) | 2016-11-21 14:24

@FreeSaber: 而且你这里用线程池没太大意义吧。直接起一个线程循环一下就完了,你线程池最后还是要到ui线程上来添加控件。

Daniel Cai | 园豆:10374 (专家六级) | 2016-11-21 14:26

@Daniel Cai: 演示里面一个线程就能跑完,项目里面不是button,是每个uc,uc的创建时间有点慢,而且高度必须实例化之后才能获取到。现在不知道怎么回事,代码都一样,到项目里面this.InvokeRequired的值一直都是false。

FreeSaber | 园豆:85 (初学一级) | 2016-11-21 14:57

@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);

}

Daniel Cai | 园豆:10374 (专家六级) | 2016-11-21 15:23
其他回答(1)
0

闭包,ThreadPool.QueueUserWorkItem(obj => AddingControls((int)obj), i);

收获园豆:20
jello chen | 园豆:7096 (大侠五级) | 2016-11-21 15:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册