小弟有一个程序,先是在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); } }
------解决方案--------------------
你先把控件都添加上。然后再起线程更新控件。别一上来就起线程做。