C#程序冻结使用秒表计时动作

时间:2014-03-03 07:44:20

标签: c# asp.net .net winforms asp.net-4.0

我有一个控制灯光的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();


    }

我还有其他一些功能,这些功能与不同的时间完全相同,我还没有在任何地方调用过,因为我无法使用它。

2 个答案:

答案 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.ElapsedMillisecondslonglong是值类型。创建副本并将其分配给elapsedTime。你需要:

while (clock1.ElapsedMilliseconds < 100)
{
    oBlynclightController.Display(BlynclightController.Color.Red);
}

请注意,此循环将非常快速地运行,直到该检查返回false。这真的是你想要的吗?我不确切知道你的代码在做什么(你没有告诉我们),但为什么不把颜色设置为红色,等待100ms,然后将其设置为...... erm,Off

人类也很难接受仅持续100毫秒的变化。它最多只是一个闪烁。