Таймер не может быть остановлен в C # - PullRequest
0 голосов
/ 26 февраля 2009

У меня есть таймер в форме Windows (C # 3.0, .net 3.5 SP1, VS2008 SP1, Vista), который, кажется, работает даже после остановки. Код:

using System;
using System.Windows.Forms;

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

        private DateTime deadline;

        private void StartTimer()
        {
            deadline = DateTime.Now.AddSeconds(4);
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            int secondsRemaining = (deadline - DateTime.Now).Seconds;

            if (secondsRemaining <= 0)
            {
                timer1.Stop();
                timer1.Enabled = false;
                MessageBox.Show("too slow...");
            }
            else
            {
                label1.Text = "Remaining: " + secondsRemaining.ToString() + (secondsRemaining > 1 ? " seconds" : " second");
            }
        }
    }
}

Даже после вызова timer1.Stop () я продолжаю получать MessageBoxes на экране. Когда я нажимаю esc, он останавливается. Однако я ожидал, что появится только одно окно сообщения ... Что еще мне следует сделать? добавление timer1.Enabled = false не меняет поведение.

Спасибо

Ответы [ 3 ]

5 голосов
/ 26 февраля 2009

Я могу ошибаться, но является ли MessageBox.Show () блокирующей операцией (которая ждет, когда вы закроете диалог)? Если это так, просто переместите вызов Show () после строк Stop / Enabled?

1 голос
/ 27 июля 2011

Обратите внимание, что следующее не нужно:

            timer1.Stop();
            timer1.Enabled = false;

Stop() совпадает с Enabled=false. И Start() совпадает с Enabled=true.

http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.enabled.aspx

1 голос
/ 26 февраля 2009

Здесь могут работать несколько факторов.

Модальное MessageBox.Show () может препятствовать тому, чтобы остановка таймера вступала в силу до тех пор, пока он не будет отменен (как указал Брайан).

Таймер timer1_Tick может выполняться в фоновом потоке. Вызовы пользовательского интерфейса, такие как MessageBox.Show () и фоновые потоки, не смешиваются.

Обе проблемы можно решить с помощью BeginInvoke для вызова метода, отображающего окно сообщения.

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