计时器未运行所有已过去的事件处理程序

时间:2015-08-17 10:36:17

标签: c# forms class timer

目前正面临这个问题的计时器。我基本上想创建一个按钮按下后执行的计时器。然后,这将计为5,然后关闭从类创建的窗口。以下是我目前的情况。

public void startMessageIndicator(string message, bool completed)
{
      messageIndicator.Text = "completed";
      window.Show();
      aTimer = new System.Timers.Timer(5000);
      aTimer.Enabled = true;
      aTimer.Start();
      aTimer.Elapsed += new ElapsedEventHandler(timerElapsed);
      aTimer.AutoReset = true;
}

public void timerElapsed(object sender, ElapsedEventArgs e)
{
      window.Close();
      st.Clear();
      aTimer.Enabled = false;
}

当我编译代码时,我没有遇到任何问题,但是当我进入调试器并使用断点时,它似乎没有运行window.close()而只是卡在那一行上。

任何想法我做错了

3 个答案:

答案 0 :(得分:2)

您应该在窗口本身上调用一个调度程序来更新UI线程。

替换

window.close();

window.Invoke((MethodInvoker)delegate
            {
                window.Close();
            });

答案 1 :(得分:1)

不要忘记Timer's Tick事件处理程序中的方法是在单独的线程中执行的,而在UI线程中创建了字段window。尝试从其创建的线程之外的其他线程调用方法会导致InvalidOperationException ...所以您只需更改代码:

window.Close();

致:

this.Invoke(new Action(() => fr.Close()), null);

现在,您在UI线程上调用操作,它应该按预期工作。

答案 2 :(得分:1)

您可以使用此

ExecuteSecure(window.Close);
//OR
ExecuteSecure(() => window.Close());


//---
private void ExecuteSecure(Action action)
{
    if (InvokeRequired)
    {
        Invoke(new MethodInvoker(() => action()));
    }
    else
    {
        action();
    }
}