有没有办法强制c#.. NET在休眠前完成执行一行代码

本文关键字:执行 代码 一行 休眠 NET 有没有 | 更新日期: 2023-09-27 18:09:11

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

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功能,它拉一切停止。

我试过使用计时器,它们有自己的问题。为此,我宁愿改变>等待>改变。我有办法做到吗?

有没有办法强制c#.. NET在休眠前完成执行一行代码

我的猜测是,这是因为完成改变颜色所需的时间比达到睡眠功能所需的时间要长,而睡眠功能会使一切停止。

不,问题是负责进行实际绘图的线程是您已置于睡眠状态的线程。阻塞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页面。