Если вы остановите таймер (вызвав Stop()
или установив Enabled = false
), он не сработает снова. Я никогда не видел случая, когда остановленный таймер вызывает обработчик событий. Если обработчик событий по-прежнему вызывается после отключения таймера, то либо другой код вызывает его, либо что-то повторно активирует таймер.
Обратите внимание, что если в данный момент выполняется обработчик события, остановка таймера не прервет событие. Это также не помешает ожидающим событиям. Хотя это не должно быть проблемой для System.Windows.Forms.Timer
, так как его обработчик событий всегда выполняется в потоке GUI.
Если бы я был вами, я бы очень внимательно проверил код и увидел все места, где таймер включен или отключен. Я подозреваю, что вы обнаружите, что в вашем коде есть что-то, что снова включает таймер.
Отредактируйте, увидев ваш опубликованный код:
Вероятно, проблема в том, что в вашем обработчике событий таймера у вас есть следующее:
System.Windows.Forms.Timer timer2 = new System.Windows.Forms.Timer();
// code that initializes and enables timer
Это создает локальную переменную timer2
, которая будет отличаться от вашей timer2
, которая находится в области видимости формы (я предполагаю, поскольку вы подразумеваете, что код компилируется, и вы ссылаетесь на timer2
в отдельной области видимости). В итоге вы создаете новый таймер, но код, который отключает таймер, ссылается на область видимости timer2
. Так что происходит то, что вы создаете много разных таймеров, и каждый из них в итоге вызывает один и тот же обработчик событий.
Я надеюсь, что ваши вызовы MessageBox.Show
в обработчике событий только для целей отладки. Вы не хотите оставлять их там, потому что они блокируют поток пользовательского интерфейса и будут препятствовать дополнительным тикам таймера, пока они не будут отклонены.