[英]C# Windows Forms Thread.Sleep() Doesn't work?
switch (Pattern[i])
{
case "Blue":
blueButton.BackColor = Color.LightBlue;
Thread.Sleep(1000);
blueButton.BackColor = Color.Red;
break;
case "Lime":
limeButton.BackColor = Color.Aquamarine;
Thread.Sleep(1000);
limeButton.BackColor = Color.Red;
break;
case "Yellow":
yellowButton.BackColor = ColorTranslator.FromHtml("#FFFF80");
Task.Delay(1000).Wait();
yellowButton.BackColor = Color.Red;
break;
case "Red":
redButton.BackColor = Color.Pink;
Task.Delay(1000);
redButton.BackColor = Color.Red;
break;
}
但是根本就沒有延遲...它只是跳過而已。 我嘗試同時使用Task.Delay和Thread.Sleep,但實際上它們都不延遲。 另外,我是一名新程序員,所以請放輕松。
Thread.Sleep
確實會按預期延遲執行,但是您在打印UI的同一線程上運行此代碼,因此看不到任何更新。
一個簡單的解決方法是Task.Delay
(您需要將該函數標記為async
):
case "Blue":
blueButton.BackColor = Color.LightBlue;
await Task.Delay(1000);
blueButton.BackColor = Color.Red;
break;
要標記函數異步,請在函數調用中添加async
關鍵字
private async Task showPattern(List<string> Pattern)
您應該閱讀有關Windows GUI線程和異步編程的一些基礎知識。
UI線程的一個非常基本的解釋:調用Form.Show
或Form.ShowDialog
,應用程序正在啟動所謂的消息循環。 此消息循環不會處理顯示的窗口的鼠標和鍵盤事件。 該消息循環也可以處理窗口的繪制。 因此,如果該線程被鎖定,則您的應用程序將無響應。 Button Click處理程序(以及Window的所有其他處理程序)由同一線程處理。 如果您在其中一個處理程序中阻止執行(就像對Thread.Delay
所做的Thread.Delay
),則窗口在此時間內無響應(不處理事件且不重繪)。
為了解決這個問題,一種解決方案是使用async
和await
。 這兩種方法做了很多編譯器魔術工作,以使其如預期的那樣工作(請查看鏈接以獲取更多信息,您絕對應該!)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.