2017-11-11 408 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