none
backgroundWorker 跨进程创建控件? RRS feed

  • 问题

  • 在主进程 页面load的时候创建了100个pannel 控件pn1_pn100,每个pannel里面要放200个textbox 和 PictureBox,但是页面可能会被卡主,进程缓慢,但是使用后台处理后面的增加事件时,backgroundWorker 提示不能跨进程处理 然后在后台创建完后添加到pannel 里的时候还要委托给主进程处理 但是这样的处理结果好像之比没加后台处理快一点点,但是还是很卡  ,有没有跨进程创建修改控件的方法?
    Pannel[] pn;
    Textbox[] tb;
    PictureBox[] pb; 
    private void Form_Load(object sender, EventArgs e)
            {
    		pn= new Pannel[100];
    		for(int i=0;i<100;i++)
    		{
    		pn[i] = new pannel();
    		pn[i].name="pn"+i;
    		Form.Controls.Add(pn[i]); 
    		}
    		backgroundWorker1.RunWorkerAsync();
    		}
    
    		private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
    			if(int i=0,i<100,i++)
    			{
    				tb=new Textbox(200);
    				pb=new PictureBox(200);
    				if(int j=0;j<200;j++)
    				{
    					tb[j]=new Textbox();
    					tb.name="tb"+[j];
    					pb[j]=new PictureBox();
    					pb.name="pb"+[j];
    					
    					if (this.InvokeRequired)
                            {
                                this.Invoke(new MethodInvoker(delegate { backgroundWorker1_DoWork(sender, e); }));
                                return;
                            }
    					
    					pn[i].Controls.Add(tb[j]);
    					pn[i].Controls.Add(pb[j]); 
    				}
    			}
    			
    		}


    if (this.InvokeRequired) 不加的话肯定会报错,但是加了就等于饶了一圈还是要到主进程
    • 已编辑 ylzl 2017年1月9日 1:11
    2017年1月9日 0:56

答案

  • Hi ylzl,

    根据MSDN上面的资料显示,backgroundWorker 应该是跨线程的调用方式。

    你使用控件Invoke方法是同步调用方法,并非异步调用方法,从理论上来讲,速度应该是和之前一样快。

    我建议你是有BeginInvoke方法去调用。 BeginInvoke 方法是异步调用,它不需要等待其他线程执行完。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 ylzl 2017年1月9日 4:30
    • 取消答案标记 ylzl 2017年1月9日 4:30
    • 已标记为答案 ylzl 2017年1月9日 4:30
    2017年1月9日 2:17
    版主
  • 一点不成熟的意见,书上说,关于控件的操作都会在主线程上操作,所以,不论同步和异步,最后都会占用主线程的时间。

    我想,是否应该先将其它急迫任务做完,再在后台异步创建这些大量的控件。

    或者分成几个部分,分批建立,也许总的时间不会省,但用户不会感觉到界面卡。
    没有测试过,仅供参考。

    • 已标记为答案 ylzl 2017年1月10日 10:53
    2017年1月9日 5:28

全部回复

  • Hi ylzl,

    根据MSDN上面的资料显示,backgroundWorker 应该是跨线程的调用方式。

    你使用控件Invoke方法是同步调用方法,并非异步调用方法,从理论上来讲,速度应该是和之前一样快。

    我建议你是有BeginInvoke方法去调用。 BeginInvoke 方法是异步调用,它不需要等待其他线程执行完。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 ylzl 2017年1月9日 4:30
    • 取消答案标记 ylzl 2017年1月9日 4:30
    • 已标记为答案 ylzl 2017年1月9日 4:30
    2017年1月9日 2:17
    版主
  • think 其实没多大改变 同步用了35S  异步用了28S  而且这期间其他控件都不能点击 必须要等这个结束

    if (this.InvokeRequired) { this.BeginInvoke(new MethodInvoker(delegate { backgroundWorker1_DoWork(sender, e); })); return; }

    • 已编辑 ylzl 2017年1月9日 4:32
    2017年1月9日 4:31
  • 一点不成熟的意见,书上说,关于控件的操作都会在主线程上操作,所以,不论同步和异步,最后都会占用主线程的时间。

    我想,是否应该先将其它急迫任务做完,再在后台异步创建这些大量的控件。

    或者分成几个部分,分批建立,也许总的时间不会省,但用户不会感觉到界面卡。
    没有测试过,仅供参考。

    • 已标记为答案 ylzl 2017年1月10日 10:53
    2017年1月9日 5:28