Как идеально остановить DispatcherTimer в C # WPF - PullRequest
0 голосов
/ 27 мая 2019

В моем проекте, когда я запускал и заканчивал таймер с помощью кнопок «Пуск» и «Стоп» в первый раз, он работал бы нормально.

Но когда я снова нажал кнопку «Пуск», не выключая программу, он начал вставлять данные дважды за интервал, как будто работали два таймера.

Третий и четвертый раз, когда я повторил, это показало ошибку вставки.

Ниже приведен мой обобщенный код, я думаю, что это не полная остановка. Я думаю, это пауза и дублирование.

Я сделал что-то не так?

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

1 Ответ

2 голосов
/ 27 мая 2019

Вы добавляете новый обработчик 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
  • , связать свойство IsChecked ToggleButton со свойством IsEnabled таймера.
  • переместить код таймера в модель представления
...