Таймер просто работает, если вызвать MessageBox.Show () - PullRequest
4 голосов
/ 31 декабря 2011

Как это возможно?У меня есть таймер, который вызывается, если нет сетевого подключения, как в методе down:

public void Foo() {
     for (int i = 0, count = MailList.CheckedItems.Count; i < count; i++) {
         /* Check for network available connection in computer
              public bool HasConnection() {
                return System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();
             }       
         */
         if (!net.HasConnection()) { 
              SearchNetworkConnection.Start(); //start the timer 
         }
     }
}

и метод _Tick Timer:

   private void SearchNetworkConnection_Tick(object sender, EventArgs e) {
            ++ATTEMPRECONNECT;

            string currentState = "attemp reconnect.."; 
            MessageBox.Show(currentState, "..", MessageBoxButtons.OK, MessageBoxIcon.Warning);

            if (ATTEMPRECONNECT >= ATTEMPRECONNECTLIMIT) {
                //do abort all process 
                SearchNetworkConnection.Stop();
            }
      }

, который работает странным образомпросто если я позвоню MessageBox.Show() после SearchNetworkConnection.Start().

Другими словами, он не работает, таймер не запустится:

if (!net.HasConnection()) { 
        SearchNetworkConnection.Start();
   }

вызов MessageBox.Show(),все работает нормально:

if (!net.HasConnection()) { 
        SearchNetworkConnection.Start();
        MessageBox.Show("lol");
 }

, если это может быть полезно, метод Foo() запускается в потоке.

Обновление

Так что, я думаю, это немного странно.Я написал простой код для некоторых тестов.и я удивлен, ошибка продолжается.Приведенный ниже код работает нормально, но если вы измените порядок

timer.Start();
DialogResult result = MessageBox.Show(text, caption);

на

DialogResult result = MessageBox.Show(text, caption);
timer.Start();

, он не будет работать, таймер не запустится.

public static DialogResult Show(string text, string caption,int dellay)
        {

            Timer timer = new Timer();
            timer.Interval = dellay;
            timer.Start();
            DialogResult result = MessageBox.Show(text, caption);
            timer.Tick += new EventHandler(delegate
             {
                    IntPtr handle = FindWindow(null, caption);

                    if (handle != IntPtr.Zero)
                    {
                        IntPtr hresult = SendMessage(handle, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);

                        if (hresult == IntPtr.Zero)
                        {
                            timer.Stop();
                            timer.Dispose();
                        }
                    }
            });

            return result;
        }

1 Ответ

4 голосов
/ 31 декабря 2011

Вашему таймеру для запуска требуется помпа сообщений.MessageBox.Show () предоставляет один.

Но вам следует полностью избегать ящиков сообщений (смотрите Systems.Diagnostsics.Debug.Print ()).

Возможно, вам следует взглянуть на другие таймеры (System.Threading, System.Timers).


Часть 2

Вы заявляете, что Foo() работает в потоке.Это звучит нормально.
Но тот факт, что для работы вашего Windows.Forms.Timer требуется MessageBox, означает, что вы каким-то образом блокируете свой основной поток.Так что ваша проблема не в размещенном коде, а где-то еще.

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