首页 > 解决方案 > 计时器每秒触发一次并更新 GUI(C# Windows 窗体)

问题描述

我有一个 Windows 窗体应用程序,我需要一个计时器工作 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!");
            }

我在这里做错了什么还是有其他建议可以通过其他方法来达到相同的结果?

标签: c#winformstimer

解决方案


计时器需要在表单级别声明,否则在表单关闭时可能不会被丢弃:

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...
  }
}

推荐阅读