C # - Winform Timer - Утилизация и опорожнение таймера - PullRequest
2 голосов
/ 21 октября 2019

Совершенно новичок в C # и таймерах, хотя мне удалось сделать некоторые действительно забавные вещи в C #, однако я не разбираюсь в Timers.

Form1.cs:

private int counter;
static System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
public void goTimer()
{
    // Set Counter
    counter = 60;

    // If timer is already enabled, stop it.
    if (timer1.Enabled)
    {
        timer1.Dispose();
        //timer1.Stop() <- also tried

    }

    timer1.Tick += new EventHandler(timer1_Tick);
    timer1.Interval = 1000; // 1 second
    timer1.Start(); // Timer exists

    txtCountdown.Text = counter.ToString();

}

private void timer1_Tick(object sender, EventArgs e)
{
    counter--;
    if(counter == 0)
    {
        timer1.Stop();
    }
    txtCountdown.Text = counter.ToString();
}

Итак, получается, что все работает так, как задумано, до тех пор, пока вы не начнете звонить goTimer();, например, с помощью нажатия кнопки, тогда он ускорит (int) counter столько, сколькокак только вы нажали ее ... И через некоторое время память будет израсходована.

В этом случае пользователи смогут вызывать функцию таймера, так как она удалит некоторые объекты, очистит некоторые данныеи обновить сеанс, но также, когда таймер достигнет 0.

Используя Winforms, я не добавил таймер в visual studio (он упоминается здесь только в Form1.cs).

Как мне завершить все таймеры, а затем перезапустить с (int) counter?

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Использование пуска и останова timer было бы правильным подходом, но обычно также будет работать вариант удаления.

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

timer1.Tick += new EventHandler(timer1_Tick);

Если вы действительно хотите каждый раз создавать новый таймер, вам нужно освободить обработчик события раньше:

timer1.Tick -= timer1_Tick;
1 голос
/ 21 октября 2019

Прежде всего, как уже упоминал MichaelSander, вы должны поместить эти строки в ваш Form1.cs конструктор:

timer1.Tick += new EventHandler(timer1_Tick); timer1.Interval = 1000; // 1 second

Во-вторых, нет смысла утилизировать ваш таймер, еслион предназначен для использования более одного раза. Вместо timer1.Dispose() вы должны использовать timer1.Stop() так же, как вы используете в обработчике timer1_Tick. Также нет смысла проверять, включен ли таймер или отключен, так как timer1.Start() и timer1.Stop() либо включат / выключат его соответственно, либо вообще ничего не сделают. Это означает, что в вашем случае вы можете полностью удалить этот блок:

if (timer1.Enabled) { timer1.Dispose(); }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...