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