C#与Form.show()命令崩溃,ObjectDisposedException - 请更深入的外观/解释

时间:2013-08-13 01:39:51

标签: c#

我正在研究一个项目,有两种形式 - 一种是主要形式,另一种是控制台 - 由分割面板和列表框组成的一种形式(在面板1中)

我调用一个方法(writeToConsole(string textToWrite)) - 顾名思义 - 在consoleWindow表单的列表框中添加一行文本

我遇到的问题是,要显示此表单,我使用一个调用show命令的按钮。但是,如果我使用右上角的“x”按钮关闭所述表单,然后再次单击“显示控制台”按钮,我会得到:

ObjectDisposedException

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

现在,我有点理解这个问题 - 我在一两个月前就已经知道了,而且据我所知,因为当你按下它时它关闭了表格,这意味着它必须重新初始化/重新加载才能成为现实。显示 - 因此错误是(在一个非常基本的概括)“我不能告诉你一些不存在/处于不确定状态的东西”

(再说一遍,这就是整个“面对它的意义,这意味着什么,但实际上没有它比那更深”的观点 - 我理解它不仅仅是那个)

我的问题是:有人可以向我解释究竟发生了什么/错了什么,以及做这类事情的最佳方式?

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

由于

为了安全起见:

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();
        }

2 个答案:

答案 0 :(得分:3)

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

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

IDisposable合同的一个要求是,如果已经处置了实现,则实现不应允许通过公共成员访问该对象。如果尝试进行此类访问,则应抛出ObjectDisposedException。

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

1)安排它以使表格实际上不会关闭,而是隐藏,并且如果主表单需要再次显示它,可以再次显示(请注意,如果表单正在进行任何类型的工作,隐藏它不一定会阻止这项工作,在你的情况下可能会或可能不会。)

2)每次要显示时都会创建一个新的Form实例(但是在Form的前一个版本中显示的任何内容在关闭时都会丢失)。

答案 1 :(得分:2)

你可能想要这样的东西:

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

您需要订阅该活动...当您想要允许表单关闭时,不要忘记取消订阅。