У меня есть приложение Windows, которое является просто формой с таймером. Мне удалось проследить это до следующей ситуации:
private void timer1_Tick(object sender, EventArgs e)
{
MessageBox.Show("Test");
timer1.Enabled = false;
}
Будет распечатываться Тест снова и снова, пока я не остановлю программу. Однако:
private void timer1_Tick(object sender, EventArgs e)
{
//MessageBox.Show("Test");
textBox1.Text += "t";
timer1.Enabled = false;
}
Просто добавляет в текстовое поле один "t".
Может ли кто-нибудь сказать мне, почему MessageBox.Show вызывает возврат функции до того, как таймер отключен?
Вызов MessageBox.Show
блокирует выполнение timer1_Tick
, пока вы не закроете messsagebox, поэтому вызов для установки timer1.Enabled = false;
не будет выполняться до тех пор, пока это не произойдет. Из-за этого таймер все еще работает и, таким образом, timer
_Tick` продолжает получать вызов, каждый раз, когда срабатывает таймер, до тех пор, пока вы не нажмете OK в одном из сообщений.
Что вам нужно, если вы хотите, чтобы окно сообщения перестало запускать таймер, является:
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Enabled = false;
MessageBox.Show("Test");
}
Вы отключили таймер после, который пользователь нажал на окно сообщения.
MessageBox.Show
показывает модальный диалог. Он вернется (к методу вызывающего абонента) после того, как пользователь ответил на сообщение. Если вы сначала отключите таймер, событие не будет запущено снова, и у пользователя будет достаточно времени для реагирования.
Попробуйте следующее:
timer1.Enabled = false;
MessageBox.Show("Test");
Вы нажимаете OK при тестировании, каждый таймер нажимает? Если ящики сообщений сохраняют один поверх другого, это потому, что MessageBox.Show
не возвращается, пока вы не закроете окно сообщения. Тем временем насос сообщений будет продолжать работать и обрабатывать ваши сообщения таймера.