当前位置: 代码迷 >> Windows Mobile >> 多线程环境下后台更新UI的有关问题
  详细解决方案

多线程环境下后台更新UI的有关问题

热度:47   发布时间:2016-04-25 07:39:35.0
多线程环境下后台更新UI的问题
小弟有一个程序,先是在Panel中动态添加了控件,添加完成后启动一个后台线程,后台线程定时从web服务器取数据,然后根据数据更新添加的控件。
我希望是控件添加完后后UI就呈现出来,然后慢慢的控件再变化。
现在发现虽然开了新的线程,但是UI总是要等后台线程完成后才呈现。主要代码如下:
C# code
private delegate void UpdatePaneldelegate(Panel panel)private void CreateControls(){......//创建控件,加入Panel,控件类型为MyControlThreadPool.QueueUserWorkItem(new WaitCallback   (UpdateItemCount));//开启线程}private void Work(object o){UpdatePaneldelegate update = new UpdatePaneldelegate(this.UpdatePanel);this.panel1.BeginInvoke(update,this.panel1);}private void UpdatePanel(Panel panel){foreach(MyControl item in panel.controls){item.text = "haha";//更新控件Thread.Sleep(500);}}


哪位大哥帮我看看为什么会这样,环境是.net cf 3.5

------解决方案--------------------
你在Invoke调用中循环一次更新所有子控件,其实跟在一个主线程中直接更新效果差不多一样的。
试试foreach放在后台线程中,在Invoke的方法中每次更新一个子控件。

C# code
        int count = 0;        private void Form1_Load(object sender, EventArgs e)        {            count = panel1.Controls.Count;            ThreadPool.QueueUserWorkItem(new WaitCallback(UpdateControl));        }        delegate void UpdateControls(int index);        private void UpdateControl(object o)        {            for (int j = 0; j < count; j++)            {                                   this.Invoke(new UpdateControls(                        delegate(int index)                        {                            panel1.Controls[index].Text = index.ToString();                        }), j);                    Thread.Sleep(1000);            }        }
------解决方案--------------------
你先把控件都添加上。然后再起线程更新控件。别一上来就起线程做。
  相关解决方案