C# 等待几微秒并更新屏幕

C# 等待几微秒并更新屏幕,c#,winforms,sleep,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 regula

我有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);
        }
    }
但是如果我试着运行这个程序,一切都不会改变。如果我只是设置为bold,则在执行结束时,所有内容都会变为bold


要开始工作,我需要使用以下工具:

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

不知道为什么,我只是努力工作了!:D

您可以使用计时器控件,而不是使用
线程.Sleep()
,因为它会阻止主
UI

步骤1:将
计时器
控件添加到
Windows窗体

步骤2:将
定时器
控件的
Interval
属性设置为
500
(例如:
1000
毫秒=
1
秒)

步骤4:将
启用
属性设置为

步骤5:处理
定时器
控件的
勾选事件,如下所示:

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

您可以使用计时器控件而不是使用
Thread.Sleep()
,因为它会阻止主
UI

步骤1:将
计时器
控件添加到
Windows窗体

步骤2:将
定时器
控件的
Interval
属性设置为
500
(例如:
1000
毫秒=
1
秒)

步骤4:将
启用
属性设置为

步骤5:处理
定时器
控件的
勾选事件,如下所示:

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

听起来你的代码是在主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
}

听起来你的代码是在主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
}

人类的眼睛和大脑只能看到100毫秒的变化!你可能需要使用计时器回调。我想你的意思是
毫秒
,而不是
睡眠时间以毫秒为单位,所以我认为微是一个打字错误。无论如何,由于WinForms自身的绘制方式,
线程.Sleep
调用可能在图形线程上,这会导致图形冻结,并且控件在还原后才能重新绘制。我已经设法使用
应用程序.DoEvents()很抱歉输入错误,毫秒,不是微秒。人类的眼睛和大脑只能看到100毫秒的变化!你可能需要使用计时器回调。我想你的意思是
毫秒
,而不是
睡眠时间以毫秒为单位,所以我认为微是一个打字错误。无论如何,由于WinForms自身的绘制方式,
线程.Sleep
调用可能在图形线程上,这会导致图形冻结,并且控件在还原后才能重新绘制。我已经设法使用
应用程序.DoEvents()很抱歉输入错误,毫秒,不是微秒。是的,一个按钮点击处理程序。我做了一些更小的事情,只是添加了
Application.DoEvents()线程.Sleep()之后的code>我认为使用Appliation.DoEvents()不是一个好方法,请检查这个是的,一个按钮点击处理程序。我做了一些较小的操作,只是添加了
Application.DoEvents()线程.Sleep()之后的code>我认为使用Appliation.DoEvents()不是一个好方法,请检查一下