当满足条件时IsXXX()返回true,否则返回false。前提:总会到达满足条件的时候,但是时间不确定。如果没有满足条件,则一直等待下去,不执行另外的语句,但是界面要能够响应操作,否则这个监听就无法控制了。在while中用Thread.Sleep会造成界面假死;在while中不用Thread.Sleep而用 Application.DoEvents()则会导致CPU占用率接近50%。如果在while中同时用Thread.Sleep(50)和Application.DoEvents(),那么表面上看不假死了,致CPU占用率也降下来了,但是事实上UI线程还是阻塞了的,界面不好使,有时点按钮没反应。
所以想避免用while,如果用多线程的话,会不会在IsDoNext()还没返回的情况下,主线程就执行接下来的操作了?        private bool m_isLisening = true;
        private void button1_Click(object sender, EventArgs e)
        {
            if (IsDoNext() == true)
            { //执行语句块A  
            }
            else
            { //执行语句块B  
            }
        }        private void button2_Click(object sender, EventArgs e)
        { 
            //切换监听状态  
            if (m_isLisening == true)
            {
                m_isLisening = false;
            }
            else 
            {
                m_isLisening = true;
            }
        }        private bool IsDoNext()
        {
            while (IsOK() == false && m_isLisening == true)
            { 
                Thread.Sleep(3000); 
            }
            return true;
        }        private bool IsOK()
        {
            if (满足条件) 
            {
                return true;
            } 
            else
            { 
                return false; 
            } 
        }

解决方案 »

  1.   

    在UI线程里使用Sleep,会阻塞UI的, 可以使用多线程,可以使用DoEvents
      

  2.   

    用 Application.DoEvents()则会导致CPU占用率接近50%。
    如果用多线程的话,会不会在IsDoNext()还没返回的情况下,主线程就执行接下来的操作了?
    谢谢先了~
      

  3.   

    是啊,在另外一个线程里使用Sleep不会阻塞UI线程
      

  4.   


    会的,一定会的,这才叫多线程,你可以设置一个信号量,当线程执行完的时候,重置这个信号量,这样在isdonext()那里就等待这个信号量就行了,当信号量有信号了,就证明线程执行完了,你就可以继续下面的工作了,
      

  5.   

    在UI中使用sleep或者其它的费时的操作,都会阻塞主线程的,可以再开一个线程,在新开的线程中计算,完成后可以更新UI的。