【问题标题】:C# program freezes using stopwatch to time an actionC# 程序冻结使用秒表来计时动作
【发布时间】:2014-03-03 07:44:20
【问题描述】:

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


    }

我还有一些其他函数,它们与 this 相同,但时间不同,我还没有在任何地方调用过,因为我无法让它工作。

【问题讨论】:

  • 你为什么将问题标记为 Asp.Net?
  • 除了 LB 的回答,尝试调查 BackgroundWorker 类。这是开始学习线程的好方法。

标签: c# .net winforms


【解决方案1】:

您的代码将永远无法运行,因为您正忙于等待而阻塞了 UI 线程。这就是您的程序似乎冻结的原因。改用计时器或异步/等待

async  void DisplayRedDot(int duration)
{
    oBlynclightController.Display(BlynclightController.Color.Red);
    await Task.Delay(duration);
    oBlynclightController.Display(BlynclightController.Color.Off);
}

【讨论】:

【解决方案2】:

elapsedTime 永远不会改变它的值。您在创建秒表后立即对其进行初始化,但从不为其分配新值。 Stopwatch.ElapsedMillisecondslonglong 是一个值类型。创建一个副本并将其分配给elapsedTime。你需要:

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

请注意,此循环将运行得非常快,直到检查返回 false。这真的是你想要的吗?我不确切知道您的代码在做什么(您没有向我们展示),但是为什么不将颜色设置为红色,等待 100 毫秒,然后将其设置为...呃,Off

人类也很难接受仅持续 100 毫秒的变化。充其量只是闪烁。

【讨论】:

  • 从技术上讲,它可能是 1 帧。这样做通常需要健康警告,因为它可能引发癫痫发作。糟糕的架构 - 编写的程序根本没有意义。这也都发生在 UI 线程上,所以 - 坏消息:没有触发器,控件永远不会重绘,因为这只会在函数结束并且 UI 线程处理重绘时发生;)
  • 好吧,如果它不在 UI 线程上运行,那么它不能更改控件的属性,并且必须调用回 UI 线程,但它不会这样做。除非它运行非常旧的 .NET 代码,否则它应该在设置属性时在某处运行异常。
  • @TomTom:是的,我不知道oBlynclightController.Display 在做什么,但是这段代码不好。我赞成 L.B. 的回应,好多了
猜你喜欢
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
相关资源
最近更新 更多