关闭表单时的StackOverflow

Rvd*_*vdK 2 c# stack-overflow exception winforms

我正在尝试关闭子表单时关闭我的主(父)表单.但是这给了我一个StackOverflow异常.

但是,如果我在FormClosed事件上调用_child.Dispose,它将按预期工作.我应该这样做吗?我为什么要打电话给Dispose?(因为.Show()它不应该是neceserry对吗?

一个小演示:

public partial class frmChild : Form
{
    public frmChild()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Close();
    }
}

public partial class frmParent : Form
{
    private frmChild _child;

    public frmParent()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        _child = new frmChild();
        _child.FormClosed += child_FormClosed;
        _child.Show(this);
    }

    void child_FormClosed(object sender, FormClosedEventArgs e)
    {
        //_child.Dispose(); <-- uncomment and it works
        this.Close(); // <-- StackOverflow exception
    }
}
Run Code Online (Sandbox Code Playgroud)

解决方案,由Teoman Soygul评论(供将来参考):

用this.Close()关闭主窗体; 表示所有子窗口按顺序关闭,以便创建无限循环

在父母中调用this.Close()后,它会向所有孩子发出关闭aswel的信号,这将发送另一个FormClosed事件......我通过不指定所有者来解决它,_child.Show();我没有使用所有者.

Teo*_*gul 6

由于每次通话时间this.Close();FormClosed事件被炒鱿鱼,然后调用this.Close();再次,创建一个无限循环.另一方面,如果表单已经处理好(如取消注释处理行),则FormClosed事件不会再次被触发,因为对象已经被处理掉了.因此,在事件中处理表单是正确的,或者如果您不想这样做,您可以使用私有bool字段添加额外的检查,例如:

if (!formClosed)
{
  this.formClosed = true;
  this.Close();
}
Run Code Online (Sandbox Code Playgroud)

  • 用`this.Close();'关闭主窗体,使所有子窗口按顺序关闭,以便创建无限循环. (2认同)