我希望我的程序能够做到这一点:
for (int i = 0; i < btns.Length; i++)
{
//Flash red
btns[i].BackColor = Color.Red;
System.Threading.Thread.Sleep(500);
//Change to green
btns[i].BackColor = Color.Green;
}
btns
是一组改变颜色的按钮。
但是当我的代码执行时,它会睡眠2.5秒(因为5个按钮)然后它们都会立即将颜色变为绿色,而不会闪烁红色。我的猜测是,这是因为完成更改颜色需要的时间比达到Sleep
功能要花费的时间长,这会使一切停止。
我尝试过使用定时器,它们有自己的问题。为此,我宁愿改变&gt;等等&gt;更改。有没有办法可以实现这个目标?
答案 0 :(得分:4)
我的猜测是,这是因为完成更改颜色需要的时间比达到睡眠功能需要的时间长,这会使一切停止。
不,问题是负责进行实际绘图的线程是你要睡觉的线程。阻止UI线程从不是一个好主意。
我尝试过使用定时器,它们有自己的问题。
尽管如此,它们可能是C#5之前最简单的方法。基本上你想要改变颜色,然后让UI线程继续使用它想要的任何东西,然后半秒后再改变颜色,等等。计时器可以让你这样做。
使用C#5确实让它更容易。您可以像这样编写async
方法:
public async Task FlashButtons()
{
foreach (Button button in buttons) // No need for a for loop here
{
button.BackColor = Color.Red;
await Task.Delay(500);
button.BackColor = Color.Green;
}
}
结合使用await
Task.Delay
“暂停”您的异步方法,但不会实际阻止UI线程。我没有时间详细介绍async / await现在如何工作,但网上有大量资源,例如this MSDN page。