gpt4 book ai didi

c# - 表单时未处理计时器

转载 作者:太空狗 更新时间:2023-10-29 18:11:08 25 4
gpt4 key购买 nike

我试图理解为什么 Windows.Forms.Timer 没有被释放,而创建它的 form 被释放了。我有这个简单的表格:

public partial class Form1 : Form {

private System.Windows.Forms.Timer timer;

public Form1() {
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) {
timer = new Timer();
timer.Interval = 1000;
timer.Tick += new EventHandler(OnTimer);
timer.Enabled = true;
}

private void OnTimer(Object source, EventArgs e) {
Debug.WriteLine("OnTimer entered");
}

private void Form1_FormClosed(object sender, FormClosedEventArgs e) {
this.Dispose();
}
}

当我关闭它时,this.Dispose 被调用,但定时器触发事件​​继续被调用。我认为 Dispose 正在释放已处置对象拥有的所有对象。那是不真实的吗? Timer 有特定的行为吗?

现在,我发现处理计时器的方法是执行 timer.Tick -= OnTimer; - 然后我在 Form1_FormClosed 事件中调用它。这是好的解决方案还是我应该做其他事情?

编辑

还是这样做更好:

private void Form1_FormClosed(object sender, FormClosedEventArgs e) {
timer.Dispose();
this.Dispose();
}

?

最佳答案

正如我在之前的评论中告诉您的那样,您应该尝试:

private Form1_FormClosing(...)
{
timer.Stop();
timer.Tick -= new EventHandler(OnTimer);
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
timer.Dispose();
timer = null;
}

这很好,因为您可以防止计时器再次循环(在 FormClosing 中),并且如果该对象(计时器)已被 < em>在使用前删除。
所以在其他地方你可以做

if (timer != null) // Note: this is false if you just use timer.Dispose()
{
....
}

关于c# - 表单时未处理计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7951821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com