Stackoverflow异常关闭表单

时间:2015-05-02 21:20:16

标签: c# winforms stack-overflow

我在WinForms中遇到了问题。我创建了一个MDIParent-Form,我从MDIParent的Load中调用了一个ChildForm。我希望如果ChildForm关闭,MDIParent必须关闭,应用程序退出。这就是为什么我在MDIParent中为childForm写一个事件,所以如果ChildForm关闭FormClosed-Event将在MDIParent中触发,但它会抛出一个堆栈溢出异常。我知道有一个无限循环,但我不知道为什么......

   private void MDIParent1_Load(object sender, EventArgs e)
    {
        Form1 childForm = new Form1();
        childForm.MdiParent = this;
        childForm.FormClosed += childForm_FormClosed;
        childForm.Show();
    }

    void childForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        this.Close(); 
        //{Cannot evaluate expression because the current thread is in a stack overflow state.}
    }

但如果我使用

  Application.Exit();

而不是this.Close() ......一切正常......我想知道为什么......有人可以解释一下吗?

更新 我没有使用MDIParent尝试相同的一切,一切正常......但是如果我使用MDIParent,为什么会出现问题

1 个答案:

答案 0 :(得分:5)

这是一个小错误,问题是当FormClosed事件触发时,孩子仍然存在于private void MDIParent1_Load(object sender, EventArgs e) { Form1 childForm = new Form1(); childForm.MdiParent = this; childForm.Disposed += childForm_Disposed; childForm.Show(); } void childForm_Disposed(object sender, EventArgs e) { this.Close(); // Fine now } 集合中。换句话说,FormClosed事件有点太快了。因此,当您关闭父级时,它将尝试再次关闭该子级。这会再次触发孩子的FormClosed事件。这又关闭了父母。等等。事件解雇顺序绝不是问题。好吧,我们称之为一个错误:)

解决方法是使用Disposed事件,稍后触发:

{{1}}