C#winform延迟闪烁标签背景

我有一个winform应用程序,我需要使标签背景闪烁。 我正在尝试使用for循环和Thread.Sleep,但不起作用。 感谢您的帮助和build议:

private void button1_Click(object sender, EventArgs e) { for (int i = 0; i < 10; i++) { System.Threading.Thread.Sleep(1000); // Set fast to slow. if (label1.BackColor == Color.Red) label1.BackColor = Color.Transparent; else label1.BackColor = Color.Red; } } 

使用一个UI定时器,而不是睡这个任务。 你让主线程始终处于睡眠状态,并且阻止用户输入。 使用Thread.Sleep 几乎总是表明你做错了什么。 Thread.Sleep正确的情况很少。 具体而言,将UI线程置于睡眠状态永远正确的。

把一个Timer组件放在你的表单上,在Tick事件中,不断地改变你的标签的背景颜色。

例如:

 // Keeps track of the number of blinks private int m_nBlinkCount = 0; // ... // tmrTimer is a component added to the form. tmrTimer.Tick += new EventHandler(OnTimerTick); m_nBlinkCount = 0; tmrTimer.Interval = 1000; // 1 second interval tmrTimer.Start(); // ... private void OnTimerTick ( Object sender, EventArgs eventargs) { if (label1.BackColor == Color.Red) label1.BackColor = Color.Transparent; else label1.BackColor = Color.Red; m_nBlinkCount++; if ( m_nBlinkCount >= 10 ) tmrTimer.Stop (); } 

这里发生的事情是,你正在睡觉的GUI线程,导致程序挂起。 GUI线程也是负责改变标签背景颜色的线程。

这是一个简单的实现,将为您解决这个问题。 请注意,这不是最好的实现,但是它使用了您的首选闪烁代码实现。 要获得比Thread.Sleep更好的选项,请参阅System.Timers.Timer,或者如xxbbcc建议的那样,使用System.Windows.Forms.Timer。

  BackgroundWorker blinker; public Form1() { InitializeComponent(); blinker = new BackgroundWorker(); blinker.DoWork += blinker_DoWork; } private void blinker_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i < 10; i++) { System.Threading.Thread.Sleep(1000); // Set fast to slow. if (label1.InvokeRequired) { label1.Invoke((Action)blink); } else { blink(); } } } private void blink() { if (label1.BackColor == Color.Red) label1.BackColor = Color.Transparent; else label1.BackColor = Color.Red; } private void button1_Click(object sender, EventArgs e) { if (blinker.IsBusy == false) { blinker.RunWorkerAsync(); } }