我在form里加了一个label然后用了一个for循环,每隔10秒,令label的text值更改一次但是这样做,form会完全卡死实际中text里也不显示任何值~~~~该怎么让他不卡呢?我用了this.label1.Refresh();,但是refresh一用就整个form都更新了而且更新完,form里还是卡的很,其他按钮根本点不了。。

解决方案 »

  1.   

    在UI线程中对控件进行循环操作时会出现界面等待的情况! 您可以尝试使用在另一线程中使用BeginInvoke来对Lable值进行更新!
    在UI上使用BackgroundWorker组件是一种很简单的多线程方案。MSDN上有很简洁的例子。可以看一下!
      

  2.   

    使用Timer组件比使用Thread.sleep()更能满足你的要求!
      

  3.   

    谢谢楼上各位,我去翻翻timer的用法去
      

  4.   

    因为这个线程是负责UI(图形界面)的,
    它的任务主要是处理图形界面的各种事件等等,
    很耗时间的循环可以放到BackgroundWorker控件里,然后用它的ProgessChanged事件来修改label的值。
    BackgroundWorker是一个很简便的多线程方案。当然对于楼主的需求,用一个Timer控件会更合适一些。
      

  5.   

    循环里使用 Application.DoEvents();你只是改变控件属性 还是Timer把
      

  6.   

    另外开一个线程,或者修改label后加上:Application.DoEvents();试试。
      

  7.   

    呵呵 应该用timer空间好些
            int i = 0;
            private void Form1_Load(object sender, EventArgs e)
            {
                timer1.Enabled = true;
                timer1.Interval = 1000;
                
            }        private void timer1_Tick(object sender, EventArgs e)
            {
                label1.Text = i.ToString();
                i++;
            }
    每1秒就变一下 呵呵
      

  8.   

    做死循环的东西最好都不要在主线程做,尤其是可能要sleep阻塞线程的,线程阻塞后就会出现你的那种按钮无法点击,label没有办法刷新的情况。
    最好的用一个新的线程去执行要执行的东西。        delegate void RefreshLabelCallback(Control lb, string text);        private void Form1_Load(object sender,EventArgs e)
            {
                Thread refresh = new Thread(new ThreadStart(Refresh));
                refresh.Start();
            }
            public override void Refresh()
            {
                RefreshLabel(lable_1,"要刷新的内容");
                Thread.Sleep(1000);
            }
            private void RefreshLabel(Control lb, string text)   //其他线程更改非该线程控件会出异常,这种写法是比较好的避免这种异常的写法
            {
                if (lb.InvokeRequired)
                {
                    RefreshLabelCallback d = new RefreshLabelCallback(RefreshLabel);
                    this.Invoke(d, new object[] { lb,text });
                }
                else
                {
                    lb.Text = text;
                }
            }
      

  9.   

    用timer
    设定固定的时间来刷新数据进行显示
      

  10.   

    谢谢各位的帮忙,还是另开一个线程了,因为label的显示需要一点操作才能获取再次谢谢