DispatcherTimer似乎没有被解雇

时间:2018-01-20 20:53:51

标签: c# wpf

我正在创建一个wpf应用程序,可以在指定的时间内打开和关闭中继,并减少标签中剩余的时间。当我点击我的按钮时,继电器按照我的预期激发但是当循环(脚本)继续执行时,滴答事件似乎不会触发。如果我注释掉除调度程序计时器代码以外的所有代码,则计时器工作正常,按预期计数到0。我错过了什么吗?感谢。

private void btnRun_Click(object sender, RoutedEventArgs e)
    {
        time = TimeSpan.FromSeconds(5);
        timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromSeconds(1);
        timer.Tick += timer_Tick;
        timer.Start();

        Script script = new Script(random, relays);
        script.Name = comboBoxSelectedScript.SelectedItem.ToString();

        // Stuck in this loop
        while (time > TimeSpan.Zero)
            script.Run();
    }       

    private void timer_Tick(object sender, EventArgs e)
    {
        if (time >= TimeSpan.Zero)
        {
            lblScriptTimeRemaining.Content = time.ToString("c");
            time = time.Add(TimeSpan.FromSeconds(-1));
        }
        else
            timer.Stop();
    }

1 个答案:

答案 0 :(得分:3)

DispatcherTimer在UI线程上运行,而while循环阻止UI线程。因此,timer_Tick方法将不会运行(这需要更改time的值,并且不会出现循环)。