C# Stackoverflow异常关闭窗体

C# Stackoverflow异常关闭窗体,c#,winforms,stack-overflow,C#,Winforms,Stack Overflow,我在WinForms中遇到问题。我创建了一个MDIParent表单,并从MDIParent的加载中调用了一个子表单。我想知道,如果子窗体关闭,父窗体必须关闭,应用程序退出。这就是为什么我在MDIParent中为子窗体编写了一个事件,因此,如果子窗体关闭,将在MDIParent中触发FormClosed事件,但它会引发堆栈溢出异常。我知道有一个无限循环,但我不知道为什么 private void MDIParent1_Load(object sender, EventArgs e)

我在WinForms中遇到问题。我创建了一个MDIParent表单,并从MDIParent的加载中调用了一个子表单。我想知道,如果子窗体关闭,父窗体必须关闭,应用程序退出。这就是为什么我在MDIParent中为子窗体编写了一个事件,因此,如果子窗体关闭,将在MDIParent中触发FormClosed事件,但它会引发堆栈溢出异常。我知道有一个无限循环,但我不知道为什么

   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,为什么会出现问题呢?这是一个小错误,问题是当FormClosed事件触发时,子项仍然存在于
MDIParent1.MdiChildren
集合中。换句话说,FormClosed事件触发得有点太快。因此,当您关闭父对象时,它将再次尝试关闭子对象。再次触发子级的FormClosed事件。这将再次关闭父级。等等。事件触发顺序从来都不是问题。好吧,让我们称之为bug:)

解决方法是使用Disposed事件,它将在以后触发:

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
}

您有一个无限循环:如果窗体被任何事件关闭,它将通知窗体关闭,这将再次触发事件,并再次尝试关闭。如果我不使用MDIParent,为什么它会工作?也许当您调用
this.close()
,它会对所有子窗体调用close,依次调用
childForm\u FormClosed
,这就是你的无限递归?我几乎可以肯定梅菲的解释是正确的。如果你关闭父母,孩子们不也会关闭吗?这可以解释你的无限循环