Windows Form Timer против однопоточного приложения - PullRequest
2 голосов
/ 06 марта 2012

У меня есть эта форма окна, timer1 включен, и его интервал установлен в 2000 мс. почему форма показывает окно сообщения каждые 2 секунды? Я имею в виду, когда первый таймер таймера, вызванный потоком пользовательского интерфейса, будет ждать, пока не будет нажата кнопка ОК, поэтому, если я не нажму кнопку, чтобы не появилось другое окно сообщения. но похоже! почему?

Я знаю, что таймер работает в своем собственном потоке, и таймер вызывает функцию timer_tick для своих интервалов, вопрос в том, как отображается другое окно сообщения, когда поток пользовательского интерфейса заблокирован в mbox.show ()?

  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
      MessageBox.Show("test");
    }
  }

Ответы [ 4 ]

3 голосов
/ 06 марта 2012

Это потому, что вы использовали MessageBox. Это модальный диалог, который прокачивает цикл сообщений. Таким образом, все нормальные уведомления Windows все еще доставляются. Как рисовать события. Единственное, что он блокирует, - это уведомления пользователя, мышь и клавиатуру. Но не сообщение таймера. Метод Form.ShowDialog () также работает таким образом.

Вам придется отключить таймер самостоятельно.

2 голосов
/ 06 марта 2012

Таймер создает собственный рабочий поток, который не ожидает кнопку ОК, как это делает основной поток пользовательского интерфейса.

Попробуйте следующее, это работает?(не могу проверить это сейчас извините)

private void timer1_Tick(object sender, EventArgs e)     
{       
    timer.Stop();
    MessageBox.Show("test");     
    timer.Start();
}

РЕДАКТИРОВАТЬ: Отвечая на вопрос в комментариях

, так что если основной поток пользовательского интерфейса остановился на mbox.Show (), почему отображается другое окно сообщения?

См. этот пост SO

MessageBox.Show покажет пользовательский интерфейс в потоке, из которого он вызван.Если в потоке еще не работает насос сообщений, он настроит временный насос для работы.Он разорвет его после того, как вызов Show завершится

0 голосов
/ 06 марта 2012

Вам нужно будет остановить таймер, когда отображается окно сообщения, и перезапустить его, когда окно закроется:

private void timer1_Tick(object sender, EventArgs e)
{
    this.timer.Stop();
    DialogResult result = MessageBox.Show("test");
    if (result == DialogResult.OK)
    {
        this.timer.Start();
    }
}
0 голосов
/ 06 марта 2012

Таймер работает в своем собственном потоке, а не в потоке пользовательского интерфейса, поэтому он не блокируется диалоговым окном сообщения.

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

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