我有一个使用System.Timers.Timer的win表单。当计时器执行时,它会更新mainForm上的变量。我得到一个例外,告诉我mainForm已被处理掉。我究竟做错了什么。如果我更新变量,程序运行正常。如果我尝试读取变量并将其发布到消息框中,一切正常。只有当我尝试从timer事件处理程序更改变量的值时才会得到异常。发生了什么事?
//works
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
MessageBox.Show(myVarFromMainForm);
}
//does not work
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
myVariableFromMainForm = 10;
}
答案 0 :(得分:0)
代码不太可能是在ObjectDisposed上发布的炸弹。但是,当您使用System.Timers.Timer时,获取异常并不令人惊讶。您有以确保在表单关闭之前关闭计时器。不这样做允许在表单对象死亡时运行Elapsed事件。
更大的问题是实际上不可能保证计时器实际停止。存在不可避免的竞争条件,当您停止计时器时,已经计划运行Elapsed事件。你可以做很多不愉快的事情。但在您去那里之前,请确保System.Windows.Forms.Timer无法解决您的问题。它是一个同步计时器,它在表单关闭后永远不会打勾。它还避免了在不使用lock语句的情况下访问Elapsed事件中的类成员时可能遇到的那种讨厌的线程问题。