如何在C#WPF中完美停止DispatcherTimer

时间:2019-05-27 16:17:27

标签: c# wpf timer dispatcher

在我的项目中,当我第一次使用“开始按钮”和“停止按钮”启动和结束计时器时,它将正常工作。

但是当我在没有关闭程序的情况下再次按下“开始按钮”时,它开始每间隔插入两次数据,就像两个计时器都在工作一样。

我第三次和第四次重复,它显示了同样多的插入错误。

下面是我的摘要代码,我认为这不是一个完整的停顿。我认为这是一个停顿和重叠。

我做错了吗?

public partial class Window1 : Window
     { DispatcherTimer timer = new DispatcherTimer();

     private void btnStart_Click(object sender, RoutedEventArgs e)
         {
             timer.Interval = TimeSpan.FromMilliseconds(1000);
             timer.Tick += new EventHandler(timer_Tick);
             timer.Start();
         }

     private void timer_Tick(object sender, EventArgs e)
         {
             //data insert
         }

     private void btnStop_Click(object sender, RoutedEventArgs e)
         {
             timer.Stop();
         }
}

2 个答案:

答案 0 :(得分:1)

每次单击按钮时,您将添加一个新的Tick处理程序。您可能还想在重新启动计时器之前检查计时器是否已经在运行。否则,您将重置间隔。

将btnStart_Click的前两行移动到Window1构造函数中:

private readonly DispatcherTimer timer = new DispatcherTimer();

public Window1()
{
    timer.Interval = TimeSpan.FromMilliseconds(1000);
    timer.Tick += new EventHandler(timer_Tick);
}

private void btnStart_Click(object sender, RoutedEventArgs e)
{
    if (!timer.IsEnabled)
    {
        timer.Start();
    }
}

private void btnStop_Click(object sender, RoutedEventArgs e)
{
    timer.Stop();
}

private void timer_Tick(object sender, EventArgs e)
{
    //data insert
}

作为进一步的改进,您可以执行以下操作:

  • 根据计时器的IsEnabled状态启用和禁用“开始”和“停止”按钮
  • 用一个ToggleButton替换两个按钮
  • 将ToggleButton的IsChecked属性绑定到计时器的IsEnabled属性。
  • 将计时器代码移至视图模型

答案 1 :(得分:-2)

在关闭窗口事件上,只需停止计时器即可。

MyWindow() 
{
    // Set up ViewModel, assign to DataContext etc.
    Closing += viewModel.OnWindowClosing;
}

public void OnWindowClosing(object sender, CancelEventArgs e) 
{
   timer.Stop();
}