簡體   English   中英

C#Windows窗體Thread.Sleep()不起作用?

[英]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.ShowForm.ShowDialog ,應用程序正在啟動所謂的消息循環。 此消息循環不會處理顯示的窗口的鼠標和鍵盤事件。 該消息循環也可以處理窗口的繪制。 因此,如果該線程被鎖定,則您的應用程序將無響應。 Button Click處理程序(以及Window的所有其他處理程序)由同一線程處理。 如果您在其中一個處理程序中阻止執行(就像對Thread.Delay所做的Thread.Delay ),則窗口在此時間內無響應(不處理事件且不重繪)。

為了解決這個問題,一種解決方案是使用asyncawait 這兩種方法做了很多編譯器魔術工作,以使其如預期的那樣工作(請查看鏈接以獲取更多信息,您絕對應該!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM