C#与Form.show()命令崩溃,ObjectDisposedException-请详细查看/解释

本文关键字:解释 ObjectDisposedException- show Form 崩溃 命令 | 更新日期: 2023-09-27 18:27:28

我正在做一个项目,有两个表单-一个是主表单,另一个是由拆分面板和列表框(在面板1中)组成的类似控制台的表单

我调用了一个方法(writeToConsole(字符串textToWrite)),顾名思义,它在consoleWindow表单的列表框中添加了一行文本

我遇到的问题是,为了显示此表单,我使用了一个调用show命令的按钮。然而,如果我用右上角的"x"按钮关闭所述表单,然后再次单击显示控制台按钮,我会得到以下信息:

ObjectDisposedException
 "Cannot access a disposed object.
Object name: 'consoleOutput'."

现在,我有点理解这个问题-我一两个月前就遇到了,据我所知,这是因为当你按下x时,它会关闭表单,这意味着它必须重新初始化/重新加载才能显示-因此错误是(简单地说)"我不能向你显示不存在/处于不确定状态的东西"

(再说一遍,这就是"表面上看,这就是它的意思,但实际上没有比这更深的"观点——我理解它比这更深)

我的问题是:有人能向我解释到底发生了什么/出了什么问题,以及做这类事情的最佳方法吗?

我理解错误的概念,我知道一两种修复方法,但我想成为一名程序员,因此(至少)想知道这种情况下的事件流程,并扩展我的知识

感谢

为了安全起见:

consoleOutput consoleOutput = new consoleOutput();
        private void btnShowConsole_Click(object sender, EventArgs e)
        {
            //Check to see if the console is visible, of which if its not, make it so
            //If it is on the other hand, just bring it to the front to show the user
            if (consoleOutput.Visible == false)
                consoleOutput.Show();
            else
                consoleOutput.BringToFront();
        }

C#与Form.show()命令崩溃,ObjectDisposedException-请详细查看/解释

本机操作系统资源是一种有价值的商品。为了有效地使用这些资源,程序不应该占用这些资源超过必要的时间。在托管代码中,.NET框架提供了System.IDisposable接口。可以通过Dispose()方法指示此接口的实现及时释放或处置该实现负责创建(托管或非托管)的任何资源。

在WinForms应用程序的情况下,几乎所有的可视化组件都在某种程度上涉及本机操作系统资源,因此这些组件实现IDisposable。当Dispose()d或Close()d时,它们将释放它们的本地资源(尽管程序仍然可以通过引用访问组件本身)。

IDisposable契约的一个要求是,如果对象已经被释放,则实现不应允许通过公共成员访问该对象。如果尝试进行此类访问,则应引发ObjectDisposedException。

在您的具体情况下,您有几个选择:

1) 安排它,使窗体不会真正关闭,而是隐藏起来,如果主窗体需要再次显示它,它可以再次显示(请注意,如果窗体正在执行任何类型的工作,隐藏它不一定会停止该工作,在您的情况下,这可能是希望的,也可能不是希望的)。

2) 每次您想要显示表单时,都要创建一个新的表单实例(但在表单的前一个化身上显示的任何内容在关闭时都会丢失)。

您可能想要这样的东西:

private void ConsoleOutput_FormClosing(object sender, FormClosingEventArgs e)
{
   this.Hide();
   e.Cancel = true; // cancel the close event.
}

您需要订阅活动。。。当你想关闭表单时,别忘了取消订阅。