有没有办法迫使C#.NET在睡觉前完成一行代码的执行?

时间:2013-04-14 15:20:35

标签: c# .net sleep

我希望我的程序能够做到这一点:

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;更改。有没有办法可以实现这个目标?

1 个答案:

答案 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