Я проверяю время и когда равно чему-то, я хочу остановить диспетчера.

Но это не работает. Таймер все еще работает после вызова Stop().

private void startTime(bool what)
{
    DispatcherTimer timer = new DispatcherTimer();

    if(what == false)
    {
        MessageBox.Show("Start");

        timer.Interval = new TimeSpan(0, 0, 1);
        timer.Tick += setTime;
        timer.Start();
    }

    if(what == true)
    {
        MessageBox.Show("Stop");

        timer.Stop();
    }
}

Когда он начинается, он показывает текст Start. Когда он должен остановиться, он должен показать текст Stop, но он все еще работает.

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

timer.stop();

Должен остановить Dispatcher, верно?

1
fullje 21 Авг 2018 в 16:06

3 ответа

Лучший ответ

Определите DispacherTimer вне вашего метода:

DispatcherTimer timer = new DispatcherTimer();
private void startTime(bool what)
{
    if (what == false)
    {
        MessageBox.Show("Start");

        timer.Interval = new TimeSpan(0, 0, 1);
        timer.Tick -= setTime;
        timer.Tick += setTime;
        timer.Start();
    }

    if (what == true)
    {
        MessageBox.Show("Stop");
        timer.Stop();
    }
}

В вашем текущем коде вы создаете новый экземпляр DispacherTimer каждый раз, когда вызывается метод.

4
mm8 21 Авг 2018 в 13:25

Ваш экземпляр DispatcherTimer должен быть приватным полем вашего класса, потому что каждый раз, когда вы вызываете startTime(...), вы создаете новый экземпляр класса DispatcherTimer, который запускается, но никогда не останавливается. Вот пример того, что можно сделать:

public class YourClass : IDisposable
{
    private readonly DispatcherTimer m_timer;

    public YourClass()
    {
          m_timer = new DispatcherTimer();
          m_timer.Interval = new TimeSpan(0, 0, 1);
          m_timer.Tick += setTime;            
    }

    public void Dispose()
    {
          m_timer.Tick -= setTime;    
          m_timer.Stop(); 
    }

    private void startTime(bool what)
    {
        if(what == false)
        {
            MessageBox.Show("Start");

            m_timer.Start();
        }

        if(what == true)
        {
            MessageBox.Show("Stop");

            m_timer.Stop();
        }
    }
}

Я также добавил реализацию IDisposable, чтобы убедиться, что экземпляр Dispatcher правильно отписан и остановлен.

2
Kzrystof 21 Авг 2018 в 13:16
Class A
{
  private DispatcherTimer _timer; // This is a global variable
  public void StartTime(bool what)
  {
   DispatcherTimer timer = new Dispatcher(); //This is a local variable
   ...
  }
}

Когда вы вызываете функцию StartTime, таймер является новым экземпляром. Если вы запустите StartTime (false) и StartTime (true), у него будет два DispatcherTimer;

0
Jason 22 Авг 2018 в 03:50
51949404