我有一个控制灯光的Windows窗体程序。这盏灯有自己的等级。我可以做一些事情,比如打开关闭并改变颜色等等。我可以毫无问题地做。然而,我想要做的是使灯持续一段特定的时间,即100毫秒或300毫秒(取决于使用)。
我曾尝试使用秒表来做这件事,但是当我点击意图执行此操作的按钮时,它会冻结程序。灯亮了,然后没有关闭,我不能使用我想要关闭的停止按钮。
程序加载灯光并对其进行初始化,并显示一条警告,说明已完成此操作并检测到一盏灯。然后我用这个:
private void Red_Click_1(object sender, EventArgs e)
{
//Displays Red
System.Threading.Tasks.Task.Factory.StartNew((Action)delegate()
{
displayRedDot();
});
}
这是displayRedDot()
public void displayRedDot()
{
System.Diagnostics.Stopwatch clock1 = new System.Diagnostics.Stopwatch();
long elapsedTime = clock1.ElapsedMilliseconds;
clock1.Start();
while (elapsedTime < 100)
{
oBlynclightController.Display(BlynclightController.Color.Red);
}
oBlynclightController.Display(BlynclightController.Color.Off);
clock1.Stop();
}
我还有其他一些功能,这些功能与不同的时间完全相同,我还没有在任何地方调用过,因为我无法使用它。
答案 0 :(得分:5)
您的代码永远不会工作,因为您正忙着等待阻止UI线程。这就是你的程序似乎冻结的原因。使用计时器或async / await代替
async void DisplayRedDot(int duration)
{
oBlynclightController.Display(BlynclightController.Color.Red);
await Task.Delay(duration);
oBlynclightController.Display(BlynclightController.Color.Off);
}
答案 1 :(得分:4)
elapsedTime
永远不会改变其价值。您在创建秒表后立即初始化它,但从不为其分配新值。 Stopwatch.ElapsedMilliseconds
是long
。 long
是值类型。创建副本并将其分配给elapsedTime
。你需要:
while (clock1.ElapsedMilliseconds < 100)
{
oBlynclightController.Display(BlynclightController.Color.Red);
}
请注意,此循环将非常快速地运行,直到该检查返回false。这真的是你想要的吗?我不确切知道你的代码在做什么(你没有告诉我们),但为什么不把颜色设置为红色,等待100ms,然后将其设置为...... erm,Off
。
人类也很难接受仅持续100毫秒的变化。它最多只是一个闪烁。