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

How to Perfectly stop DispatcherTimer in C# WPF

在我的项目中,当我第一次使用 'start button' 和 'stop button' 开始和结束计时器时,它会正常工作。

但是当我在不关闭程序的情况下再次按下 'start button' 时,它开始每隔一段时间插入两次数据,就好像有两个定时器在工作一样。

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

下面是我的总结代码,我认为这不是一个完整的停止。我认为这是一个暂停和重叠。

我是不是做错了什么?

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();
         }
}

您每次单击按钮时都会添加一个新的 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 替换两个 Button
  • 将 ToggleButton 的 IsChecked 属性 绑定到定时器的 IsEnabled 属性。
  • 将计时器代码移至视图模型