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
or Form.ShowDialog
应用程序正在启动所谓的消息循环。该消息循环确实处理所显示窗口的鼠标和键盘事件。该消息循环也处理窗口的绘制。因此,如果该线程被锁定,您的应用程序将变得无响应。按钮单击处理程序(以及窗口的所有其他处理程序)均由同一线程处理。如果您阻止此处理程序之一的执行(就像您所做的那样)Thread.Delay
)窗口在这段时间内没有响应(不处理事件并且不重绘)。
为了解决这个问题,一个解决方案是与async
and await
。这两种方法做了很多编译器魔法,使这项工作如人们所期望的那样(检查链接以获取更多信息,你绝对应该!)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)