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這篇文章就會明白的.所以當延遲時間很小的時候,這個消息泵不會被阻塞太久,就能及時地響應用戶的操作.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM