我在form上创建了两个label控件,现在想实现在label2控件上不停的刷新显示随机产生的数字。原理很简单,可是我碰到一些问题,请高手给分析下我错在哪里了?
程序如下:如果不用while (b){}可以显示数据,但是不能不停的刷新;我把while (b) {}加上之后就没有反应了,按F5之后连窗体都出不来了,请高手给分析下错在哪里了,谢谢!
        private void Form1_Load(object sender, EventArgs e)
        {            double vol;
            bool b = true;
            while (b)
            {
                Random V = new Random();
                vol = V.Next(0, 300);
                label2.Text = vol.ToString();
                System.Threading.Thread.Sleep(100);
           }

解决方案 »

  1.   

    你在主线程上创建了死循环。。窗体当然不动了。
            private void Form1_Load(object sender, EventArgs e)
            {
                Thread thread = new Thread(new ThreadStart(Run));
                thread.Start();
            }        private void Run()
            {
                while (true)
                {
                    Random rand = new Random();
                    this.label1.Text = rand.Next(0, 300).ToString();
                    Thread.Sleep(100);
                }
            }
      

  2.   

                while (b) 
                { 
                    Random V = new Random(); 
                    vol = V.Next(0, 300); 
                    label2.Text = vol.ToString(); 
                    System.Threading.Thread.Sleep(100); 
              }//主线程一直阻在这里了。不能继续执行
      

  3.   

     private void Form1_Load(object sender, EventArgs e) 
            {             double vol; 
                bool b = true; 
                while (b) 
                { 
                    Application.DoEvents();
                    Random V = new Random(); 
                    vol = V.Next(0, 300); 
                    label2.Text = vol.ToString(); 
                    System.Threading.Thread.Sleep(100); 
              }
      

  4.   


    感谢三楼的回答,我把你的代码运行了一下,出现了新的问题,下面是提示的错误:
    未处理的“System.InvalidOperationException”类型的异常出现在 System.Windows.Forms.dll 中。
    其他信息: 线程间操作无效: 从不是创建控件“label1”的线程访问它。这该怎么修改呢?还请高手指点一下
      

  5.   

    你创建的主线程中有label1,附加的线程中又没有label1,当然出错啦
      

  6.   

    在构造函数 InitializeComponent();下面加一句话
    Control.CheckForIllegalCrossThreadCalls = false;
      

  7.   

    高人啊,我查了一下,多数都是用下面的方式来实现:
    1.增加一个delegate void SetVisibleDelegate();2.新加一个函数privare void sinvoke(){this.Invoke(new SetVisibleDelegate(s))}3.之后重新调用private void showtable_btn_Click(object sender, EventArgs e){thread t = new thead(sinvoke)t.start()}