c# - Stackoverflow 异常关闭表单

标签 c# winforms stack-overflow

我在 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 事件触发时,子对象仍然存在于 MDIParent1.MdiChildren 集合中。换句话说,FormClosed 事件触发的有点太早了。所以当你关闭父级时,它会再次尝试关闭子级。这再次触发 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
}

关于c# - Stackoverflow 异常关闭表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30007624/

相关文章:

c# - 尝试从空集合中进行选择时的 LINQ 查询问题

c# - 不使用派生类中的方法

c# - Hangfire 重复工作不会立即开始

.net - 如何阻止Winforms面板滚动?

C# 动态 MenuStrip(不接触窗体)

c# - .NET WinForms 多线程行为 : Setting property value in ThreadPool. QueueUserWorkItem 尽管有异常

sql - 从Apache Drill查询Hive导致Stackoverflow错误

java - 在外部类中创建新实例时出现 StackOverflow 错误

带有 MessageBox 的 C# String.SubString 不显示任何内容

ruby - 为什么这些 Ruby 方法之一会导致 'stack overflow' 而另一个不会? (排列算法)