等几微秒,然后更新屏幕

时间:2013-11-15 17:34:18

标签: c# winforms sleep

我有4个标签,每个等待500毫秒后必须更改为粗体。

我试过使用这个功能:

       LabelUpdater(lblIF); //to bold
       Thread.Sleep(500);
       LabelUpdater(lblIF); //to regular again
       LabelUpdater(lblID); //to bold
       Thread.Sleep(500);
       LabelUpdater(lblID); //to regular again


    private void LabelUpdater(Label labelActual)
    {
        if (labelActual.Font.Bold)
        {
            Console.WriteLine("Regular - " + DateTime.Now);
            labelActual.Font = new Font(labelActual.Font, FontStyle.Regular);
        }
        else
        {
            Console.WriteLine("Bold- " + DateTime.Now);
            labelActual.Font = new Font(labelActual.Font, FontStyle.Bold);
        }
    }

但如果我尝试运行这个程序,没有任何改变。如果我只是设置为粗体,那么在执行结束时一切都会变为粗体。


要开始工作,我需要使用它:

       LabelUpdater(lblIF); 
       Thread.Sleep(500);
       Application.DoEvents(); //here
       LabelUpdater(lblIF); 
       LabelUpdater(lblID); 
       Thread.Sleep(500);
       Application.DoEvents(); //here
       LabelUpdater(lblID); 

不知道为什么,我只是尝试过并且工作过! :d

2 个答案:

答案 0 :(得分:3)

你可以使用Timer Control而不是Thread.Sleep()来阻止主UI

第1步:将Timer控件添加到Windows Form

第2步:将Interval控件的Timer属性设置为500(例如:1000毫秒= 1

第4步:将Enabled属性设置为True

第5步:处理Tick对象的Timer事件,如下所示:

private void timer1_Tick(object sender, EventArgs e)
        {
          LabelUpdater(lblIF); //to bold
        }

答案 1 :(得分:1)

听起来您的代码在主GUI线程上运行,是否在按钮单击处理程序中?

在当前处理程序执行完毕之前,不会处理代码中触发的事件。

尝试在后台线程上运行代码,或者转发给计时器。请注意,您需要处理对GUI的跨线程调用。

Task.StartNew(BackgroundLabelToggle, Label[] {  lblIF, lblID });

private static void BackgroundLabelToggle(Label[] labels)
{
   var a = labels[0];
   var b = labels[1];

   a.Invoke(LabelUpdater, a); //to bold
   Thread.Sleep(500);
   a.Invoke(LabelUpdater, a); //to regular again
   b.Invoke(LabelUpdater, b); //to bold
   Thread.Sleep(500);
   b.Invoke(LabelUpdater, b); //to regular again
}