有没有办法强制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
功能,它拉一切停止。
我试过使用计时器,它们有自己的问题。为此,我宁愿改变>等待>改变。我有办法做到吗?
我的猜测是,这是因为完成改变颜色所需的时间比达到睡眠功能所需的时间要长,而睡眠功能会使一切停止。
不,问题是负责进行实际绘图的线程是您已置于睡眠状态的线程。阻塞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页面。