【问题标题】:C# Windows Forms Thread.Sleep() Doesn't work?C# Windows 窗体 Thread.Sleep() 不起作用?
【发布时间】:2019-06-24 22:22:54
【问题描述】:
 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 但实际上没有一个延迟。另外,我是一名新程序员,所以请放轻松。

【问题讨论】:

  • 有必要提供您正在解决的实际问题,而不仅仅是您的错误解决方案。
  • 你确定值是红色、黄色、石灰还是蓝色?
  • 我只是想让它看起来像一个按钮被按下。我检查了它也确实进入了案例。它只是跳过延迟并切换到红色。
  • 您切换颜色但阻塞了 UI 线程,因此在 Window 上看不到任何更新。您可以使用 await Task.Delay(1000)

标签: c# winforms


【解决方案1】:

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 Thread 的一个非常基本的解释: 当您调用Form.ShowForm.ShowDialog 时,应用程序正在启动所谓的消息循环。此消息循环确实处理所示窗口的鼠标和键盘事件。这个消息循环也处理窗口的绘制。因此,如果此线程被锁定,您的应用程序将变得无响应。按钮单击处理程序(以及您窗口的所有其他处理程序)由同一线程处理。如果您在其中一个处理程序中阻止执行(就像您对 Thread.Delay 所做的那样),则窗口在这段时间内没有响应(不处理事件并且不重绘)。

要解决此问题,一种解决方案是使用 asyncawait 。这两种方法在编译器方面发挥了很大的作用,可以使这项工作按预期工作(查看链接了解更多信息,您绝对应该这样做!)

【讨论】:

  • 再次,我很抱歉,但将其标记为异步意味着什么以及如何做到这一点?
猜你喜欢
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 2016-10-19
  • 1970-01-01
相关资源
最近更新 更多