C# 等待几微秒并更新屏幕
我有4个标签,每次等待500毫秒后必须更改为粗体 我已尝试使用此功能: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
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()不是一个好方法,请检查一下