Fork me on GitHub

Thread.Sleep太久,界面卡死

在Winform程序的UI界面使用Thread.Sleep,窗体界面会被卡死,如图1所示,程序sleep 5000毫秒,时间到了之后,按钮的名称才更改过来,窗体也能被鼠标拖动。而用Delay方法,就能让窗体在sleep中,也能活动起来,如图2所示。

图一

图二

 

private void button1_Click(object sender, EventArgs e)
        {
            //button1.Text = "用Thread...";
            //System.Threading.Thread.Sleep(5000);
            button1.Text = "用Delay...";
            Delay(5000);
        }

        public void Delay(int millSeconds)
        {
            Stopwatch watch = new Stopwatch();

            while (watch.ElapsedMilliseconds < millSeconds)
            {
                System.Threading.Thread.Sleep(50);

                Application.DoEvents();
            }

            watch.Stop();
        }

 最主要的就是这个Delay方法,用到一个秒表,之后是一个循环,循环里面的条件是当秒表计时器时间<Delay时间时,用50毫秒作为单位延迟时间,Application.DoEvents()的作用就是:处理所有的当前在消息队列中的Windows消息.这个消息队列大概是你对windows窗体进行的操作按先后顺序的入队.windows窗体维持着一个消息泵,会阻塞式的循环这个队列.参考:http://www.cnblogs.com/blosaa/archive/2013/05/31/3109586.html这篇文章就会明白的.所以当延迟时间很小的时候,这个消息泵不会被阻塞太久,就能及时地响应用户的操作.

 

posted @ 2019-01-11 16:12  HelloLLLLL  阅读(1916)  评论(1编辑  收藏  举报