如何在 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 属性。
- 将计时器代码移至视图模型
在我的项目中,当我第一次使用 '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 属性。
- 将计时器代码移至视图模型