【问题标题】:Is there a way to force C#.NET to finish executing a line of code before sleeping?有没有办法强制 C#.NET 在睡觉前完成一行代码的执行?
【发布时间】:2013-04-06 17:04:41
【问题描述】:

我希望我的程序执行以下操作:

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 sleep


    【解决方案1】:

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

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

    awaitTask.Delay 一起使用会“暂停”您的异步方法,但不会真正阻塞UI 线程。我现在没有时间详细说明 async/await 是如何工作的,但是网上有很多资源,比如this MSDN page

    【讨论】:

      猜你喜欢
      • 2015-05-23
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      相关资源
      最近更新 更多