目前正面临这个问题的计时器。我基本上想创建一个按钮按下后执行的计时器。然后,这将计为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()而只是卡在那一行上。
任何想法我做错了
答案 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();
}
}