我正在做一个项目,有两种形式 - 一种是主形式,另一种是类似控制台的形式,由一个拆分面板和一个列表框(在面板 1 中)组成
我调用了一个方法 ( writeToConsole(string 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();
}
最佳答案
native 操作系统资源是一种宝贵的商品。为了有效地使用它们,程序不应该持有这些资源超过必要的时间。在托管代码中,.NET 框架提供了 System.IDisposable界面。可以通过 Dispose() 方法指示此接口(interface)的实现及时释放或处置该实现负责创建(托管或非托管)的任何资源。
在 WinForms 应用程序的情况下,几乎所有可视组件都在某种程度上涉及 native 操作系统资源,因此这些组件实现了 IDisposable。当 Dispose()d 或 Close()d 时,它们将释放其 native 资源(尽管程序仍可通过其引用访问组件本身)。
IDisposable 契约的要求之一是,如果对象已经被处置,则实现不应允许通过公共(public)成员访问该对象。如果尝试进行此类访问,则应抛出 ObjectDisposedException。
在您的具体情况下,您有两种选择:
1) 对其进行安排,使表单实际上不会关闭,而是隐藏起来,并且可以在主表单需要再次显示时再次显示(请注意,如果表单正在执行任何类型的工作,隐藏它不一定会停止这项工作,在您的情况下可能需要也可能不需要)。
2) 每次你想显示它时创建一个新的表单实例(但是任何显示在表单的前一个化身上的东西在关闭时都会丢失)。
关于C# 使用 Form.show() 命令崩溃,ObjectDisposedException - 请更深入地了解/解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18199343/