0

我希望我的程序做的事情是这样的:

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功能所需的时间更长,这会使一切都停止。

我试过使用定时器,它有自己的问题。为此,我宁愿改变>等待>改变。有没有办法我可以做到这一点?

4

1 回答 1

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 是如何工作的,但是网上有很多资源,比如这个 MSDN 页面

于 2013-04-14T15:24:32.437 回答