一个for循环语句如下
for(int i=0;i<10000;i++)
{
this.label1.Text=i.toString();
}
运行后label只显示了最后结果,之间的结果我想是显示的,但是没有一种动态变化的效果,请问这个如何实现?问题也许很低端,还望赐教
for(int i=0;i<10000;i++)
{
this.label1.Text=i.toString();
this.label1.Refresh();//好像就可以解决 有那中动态变化的感觉
}
其实是显示的,但是太快了亲,所以直接显示循环结束后的数据,可以在每次循环的时候设置下时间间隔就OK了。
顶起
你需要做异步处理,
for(int i=0;i<10000;i++)
{
this.label1.Text=i.toString();
Application.DoEvents();
}
+1
简单方式用 Application.DoEvents()就可以了,但是这样用有严重后果
private void button1_Click(object sender, EventArgs e) { // Clear the list listBox1.Items.Clear(); // Get data from database or file for (Int32 i = 0; i < 100000; i++) { // Add the data to list listBox1.Items.Add(i); Application.DoEvents(); } }
运行上面的程序,先点击一次按钮,button1_Click被调用,listBox1.Items.Clear()清空列表,然后开始添加数据到列表。如果这个时候,我们再次点击按钮,一个Button Click消息被加入到消息队列。在没有调用Application.DoEvents时,这条新的消息只有在button1_Click处理完后,才会被调用。这样尽管界面有段时间没有响应,但list中的数据仍能保持完整。但当加入Application.DoEvents()后,在第一次处理button1_Click过程中,新的消息再次被处理,button1_Click第二次被调用,同样listBox1被清空。但是由于第一次的button1_Click还执行完,后面的Add动作仍会在第二次button1_Click都执行完成后执行,List就变成了1,2,3,4,5,6,4,5,6。而这种行为造成程序不稳定性,有时候数据是好的,有时候又有重复的数据。造成Reentrancy问题原因是由于DoEvents会处理消息队列中的所有消息,如果DoEvents能够提供只处理WM_Paint事件的话,就不会有这个问题。但是由于消息队列结构的设计不完全支持优先级,所以Win32或WinForm没法解决这个问题。
所以要彻底解决这个问题就必须使用多线程,也就用到了委托,代码改成下面这样就可以使用了。关于多线程的知识还要去看看相关文章了解。
public Form1() { InitializeComponent(); updateList = new UpdateUICallBack(UpdateList); } private void button1_Click(object sender, EventArgs e) { ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork)); } private delegate void UpdateUICallBack(Int32 value); private UpdateUICallBack updateList; private void DoWork(Object state) { for (Int32 i = 0; i < 10000; i++) { updateList(i); } } private void UpdateList(Int32 value) { if (listBox1.InvokeRequired) listBox1.Invoke(updateList, new Object[] { value}); else listBox1.Items.Add(value); }
根据LZ的需求,只需要把上面代码的UpdateList()中的listbox替换就可以了
大哥。。。这个不要误导小盆友了!!!。。这个方法,是在无解1
不好意思说错话了。。。这个是线程池的,我还没用过,,抱歉!!
学习了。。。。之前的当我没说。。。哥哥,别生气啊,,不过你的第一个方法,实在是误导小盆友
@SeeMore: - -! 我没那么老。第一个方法不就是lz提出的问题么?
使用线程把,然后在里面来个睡觉。就可以了。
哈哈。。。。这个回答好玩啊!!
用timer计时器也可以实现的,你新手,,应该还想不到线程,建议用timer先把效果实现了,等以后了解了在用线程
顶起
新手完全支持用这个
for(int i=0;i<10000;i++)
{
this.label1.Text=i.toString();
this.label1.Refresh();
}
这个办法很有效