c# - 关闭表单时的 StackOverflow

标签 c# winforms exception stack-overflow

我试图在关闭子窗体时关闭我的主(父)窗体。然而,这给了我一个 StackOverflow 异常。

但是,如果我在 FormClosed 事件上调用 _child.Dispose,它会按预期工作。我应该这样做吗?我为什么要调用 Dispose? (因为 .Show() 它不应该是必需的吗?

一个小演示:

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
    }
}

解决方案,Teoman Soygul 评论(供以后引用):

Closing the main form with this.Close(); signals all child windows to close in order so that creates the infinite loop

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

最佳答案

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

if (!formClosed)
{
  this.formClosed = true;
  this.Close();
}

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

相关文章:

c# - 图片 url 的正则表达式

c# - 您在 *nix 服务器上的 ASP.NET Core 生产中使用哪个 Web 服务器?

c# - 在 Winform 应用程序的 App.config 中添加注释

c# - 如何从数据库 SQL 添加组合框值

c# - Entity Framework 6.1.3 从代码优先模型初始化现有但为空的数据库

c# - 清除图片框 - c#

authentication - Identity Server 4 日志(无效对象名称 'DeviceCodes' )异常

java - 使用 Geotools 将修改后的形状内容保存到 PostGIS 失败并出现 NullPointerException

java - 不能在 java.net.http.HttpClient 上发出多个请求,否则将收到 : javax.net.ssl.SSLHandshakeException

C# LINQ to Entities 无法识别方法 'Boolean'