Таймер запускается каждую секунду и обновляет графический интерфейс (C # Windows Forms) - PullRequest
0 голосов
/ 17 октября 2019

У меня есть приложение Windows Forms, где мне нужно, чтобы таймер работал в течение 90 секунд, и после его окончания должна отображаться каждая секунда, что-то вроде секундомера 1..2..3 и т. Д., После истечения 90 секунд,должно выдаваться исключение, что что-то не так.

У меня есть следующий код, но RunEvent никогда не срабатывает.

        private void ScanpXRF()
        {
            bool demo = false;

            System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();

            try
            {

                for (int timerCounter = 0; timerCounter < 90; timerCounter++)
                {
                    timer.Interval = 1000;
                    timer.Tick += new EventHandler(RunEvent);
                    timer.Start();

                    if(timerCounter == 89) {
                      throw new Exception(); 
                     }
                }

            }
            catch (Exception e)
            {
                timer.Dispose();
                MessageBox.Show("There is a problem!");                   
            }       
        }


          private void RunEvent(object sender, System.EventArgs e)
            {
                //boxStatus.AppendText("RunEvent() called at " + DateTime.Now.ToLongTimeString() + "\n");
                MessageBox.Show("timer fired!");
            }

Есть ли что-то, что я делаю здесь неправильно или естьдругие предложения по другим способам достижения того же результата?

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

Таймер должен быть объявлен на уровне формы, иначе он не может быть утилизирован при закрытии формы:

System.Windows.Forms.Timer timer;
int counter = 0;

Ваш стартовый код должен просто запустить таймер:

private void ScanpXRF()
{
   counter = 0;
   timer = new System.Windows.Forms.Timer();
   timer.Interval = 1000;
   timer.Tick += RunEvent;
   timer.Start();
}

RunEvent - это событие Tick, которое вызывается каждую секунду, поэтому ваша логика должна быть там:

private void RunEvent(object sender, EventArgs e)
{
  counter++;
  if (counter >= 90) {
    timer.Stop();
    // do something...
  }
}
0 голосов
/ 19 октября 2019

заставил это работать

   private void ScanpXRF()
        {
            _pXRFTimerCounter = 0;
            pXRFTimer.Enabled = true;
            pXRFTimer.Interval = 1000;
            pXRFTimer.Elapsed += new ElapsedEventHandler(pXRFTimer_Tick);
            pXRFTimer.Start();
        }

        private static void pXRFTimer_Tick(Object sender, EventArgs e)
        {
            _pXRFTimerCounter++;

            if (_pXRFTimerCounter >= 90)
            {
                pXRFTimer.Stop();
                // do something...               
            }
            else
            {
                MessageBox.Show(_pXRFTimerCounter.ToString() + " seconds passed");
            }
        }

Я сделал таймер

System.Timers

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