Stackoverflow 异常关闭表单
Stackoverflow Exception closing Form
我在 WinForms 中遇到问题。我创建了一个 MDIParent-Form,并从 MDIParent 的负载中调用了一个 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
为什么会出现问题
这是一个小错误,问题是当 FormClosed 事件触发时 child 仍然存在于 MDIParent1.MdiChildren
集合中。换句话说,FormClosed 事件触发的有点太早了。因此,当您关闭 parent 时,它会再次尝试关闭 child。再次触发 child 的 FormClosed 事件。再次关闭 parent。等等。事件触发顺序从来都不是问题。好吧,让我们称之为错误 :)
解决方法是改为使用 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
}
我在 WinForms 中遇到问题。我创建了一个 MDIParent-Form,并从 MDIParent 的负载中调用了一个 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
为什么会出现问题这是一个小错误,问题是当 FormClosed 事件触发时 child 仍然存在于 MDIParent1.MdiChildren
集合中。换句话说,FormClosed 事件触发的有点太早了。因此,当您关闭 parent 时,它会再次尝试关闭 child。再次触发 child 的 FormClosed 事件。再次关闭 parent。等等。事件触发顺序从来都不是问题。好吧,让我们称之为错误 :)
解决方法是改为使用 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
}