在C#窗口程序中,如果在主線程里調用Sleep,在Sleep完成之前, 界面呈現出假死狀態,不能響應任何操作!
下邊實現的是非獨占性延時函數,延時過時中界面仍可響應消息:
public static void Delay(int milliSecond) { int start = Environment.TickCount; while (Math.Abs(Environment.TickCount - start) < milliSecond) { Application.DoEvents(); } }
關於Math.Abs():
Environment.TickCount,內部API是用DWORD GetTickCount()來實現的,該屬性的值從系統計時器派生,並以 32 位有符號整數的形式存儲。因此,如果系統連續運行,TickCount 將在約 24.9 天內從零遞增至 Int32. MaxValue ,然后跳至 Int32. MinValue (這是一個負數),再在接下來的 24.9 天內遞增至零。DWORD是無符號的,而 Environment.TickCount屬性返回的值是有符號的,所以有一半的值用負數表示!