You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Form.Show()重复打开窗体触发ObjectDisposedException的解决方法

解决WinForms窗体关闭后再次打开触发ObjectDisposedException的问题

这个问题我太熟悉了,WinForms里窗体关闭后直接复用实例确实会踩这个坑!原因很简单:当你调用Form.Close()时,.NET会自动调用窗体的Dispose()方法释放所有非托管资源(比如窗口句柄),这时候整个窗体对象已经被标记为“已释放”,再调用它的任何成员(比如Show())自然就会抛出ObjectDisposedException。

下面给你几种靠谱的解决办法,按需选择就行:

1. 每次打开时创建新的窗体实例(最常用、最安全)

如果不需要保留窗体的状态(比如用户输入的内容),这是最简单的方案。原来的错误写法通常是复用同一个实例,改成每次打开都new一个新实例就搞定了:

错误写法(复用实例导致报错)

private MyForm _myForm = new MyForm();

private void OpenButton_Click(object sender, EventArgs e)
{
    _myForm.Show(); // 第一次正常,Close后第二次触发异常
}

正确写法(模态窗口)

如果是模态窗口(打开后不能操作主窗口),可以用using自动释放资源:

private void OpenButton_Click(object sender, EventArgs e)
{
    using (var myForm = new MyForm())
    {
        myForm.ShowDialog(); // 模态窗口关闭后自动Dispose,不会占用资源
    }
}

正确写法(非模态窗口)

非模态窗口不能用using(因为Show()是异步的,using会在方法结束后立刻Dispose,导致窗口直接消失),直接创建实例调用Show()即可:

private void OpenButton_Click(object sender, EventArgs e)
{
    var myForm = new MyForm();
    myForm.Show();
}

2. 拦截关闭事件,改为隐藏窗体(保留状态时用)

如果需要保留窗体的状态(比如用户输入的内容、控件的配置),可以拦截窗体的关闭操作,把“关闭”改成“隐藏”,下次打开时直接显示即可:

在窗体类中重写OnFormClosing方法

protected override void OnFormClosing(FormClosingEventArgs e)
{
    // 只拦截用户主动关闭的情况,避免程序退出时窗体无法正常关闭
    if (e.CloseReason == CloseReason.UserClosing)
    {
        e.Cancel = true; // 取消关闭操作
        this.Hide(); // 隐藏窗体
        return;
    }
    base.OnFormClosing(e); // 其他情况(比如程序退出)正常关闭
}

调用端代码(复用同一个实例)

// 只创建一次实例,保留状态
private MyForm _myForm = new MyForm();

private void OpenButton_Click(object sender, EventArgs e)
{
    _myForm.Show(); // 隐藏后调用Show()可正常显示
}

注意:如果后续需要彻底释放资源,可以在程序退出时手动调用_myForm.Dispose()。

3. 检查实例状态,已释放则重新创建(折中方案)

如果既想复用状态,又担心窗体被意外Dispose(比如其他地方调用了Dispose方法),可以在打开前检查实例是否有效,无效则重新创建:

private MyForm _myForm;

private void OpenButton_Click(object sender, EventArgs e)
{
    // 检查实例是否为空,或者已被释放
    if (_myForm == null || _myForm.IsDisposed)
    {
        _myForm = new MyForm();
    }
    _myForm.Show();
}

这种方式兼顾了状态保留和异常防护,适合不确定窗体是否会被意外释放的场景。


内容的提问来源于stack exchange,提问作者BG1SC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:17:45