2017-11-11 83 views
-1
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,但實際上並沒有延遲。另外我是一個新的程序員,所以要輕鬆一點。C#Windows窗體Thread.Sleep()不起作用?

+1

有必要提供您正在解決的實際問題,而不僅僅是您的破解。 – zerkms

+0

你確定價值是紅色,黃色,石灰或藍色? –

+0

我只是想讓它看起來像一個按鈕被按下。它也進入了案件,我檢查。它只是跳過延遲並切換到紅色。 –

回答

2

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 Thread和async programming的基礎知識。

UI的一個非常基本的解釋線程: 當您調用Form.ShowForm.ShowDialog應用程序正在啓動一個所謂的消息循環。此消息循環會處理所示窗口的鼠標和鍵盤事件。這個消息循環也處理窗口的繪製。因此,如果此線程被鎖定,您的應用程序將變得無法響應。按鈕單擊處理程序(以及您的窗口的所有其他處理程序)都由同一個線程處理。如果您在其中一個處理程序中阻止執行(如您在Thread.Delay中所做的那樣),則此時間窗口無響應(不處理事件並且不重繪)。

要解決此問題,一個解決方案是與asyncawait一起使用? 。這兩種方法做了大量的編譯器魔法,使其工作正如人們所期望的那樣(查看鏈接以獲取更多信息,您絕對應該!)

+0

再一次,我很抱歉,但將其標記爲異步意味着什麼以及如何做到這一點? –

0

這是有點難以重現與你的相同的情況,但在這裏我做了一個小小的嘗試來測試你的問題,並像這樣工作。爲簡單起見,我只使用一個按鈕,並通過從組合框中切換所選值來執行所有操作。它將顏色轉換爲指定的顏色,然後在一秒後將顏色轉換爲紅色。我會盡量發佈一個gif儘快。

enter image description here

您的代碼工作就像一個魅力!我建議檢查其他控件或開關變量。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace WindowsFormsApp1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 

      String color = this.comboBox1.SelectedItem.ToString(); 

      switch (color) 
      { 
       case "Blue": 
        button1.BackColor = Color.LightBlue; 
        Thread.Sleep(1000); 
        button1.BackColor = Color.Red; 
        break; 
       case "Lime": 
        button1.BackColor = Color.Aquamarine; 
        Thread.Sleep(1000); 
        button1.BackColor = Color.Red; 
        break; 
       case "Yellow": 
        button1.BackColor = ColorTranslator.FromHtml("#FFFF80"); 
        Task.Delay(1000).Wait(); 
        button1.BackColor = Color.Red; 
        break; 
       case "Red": 
        button1.BackColor = Color.Pink; 
        Task.Delay(1000); 
        button1.BackColor = Color.Red; 
        break; 
      } 
     } 
    } 
} 
+1

我敢肯定,紅色的情況下不會工作..作爲調用task.delay不等待等待,所以它會繼續不是嗎? – Dave

+0

嗨戴夫...我剛測試!是的......奇怪的是,所有的情況,但黃色不起作用。如果我改變它們的工作顏色 – oetoni