C# 使用 Form.show() 命令崩溃,ObjectDisposedException - 请更深入地了解/解释

标签 c#

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

我调用了一个方法 ( w​​riteToConsole(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/

相关文章:

c# - Win32Exception 参数不正确

java - 缩放图像并将其定位在 WPF 中的 0,0

javascript - 使用 Javascript 在导航栏中显示当前选项卡

c# - 如何在WPF MVVM中将View对象发送到ViewModel?

c# - 为什么 C# HttpWebRequest 会在 ResponseStream 上返回 500 错误,而 PHP 却不会?

c# - 在类型上找不到匹配的构造函数

c# - 如何将 async/await 与使用基于事件的异步模式的库一起使用?

c# - 如何使用 JSON.Net 反序列化此 json 数据?

c# - 如何将字符串数组传递给属性构造函数?

c# - 在将列表连接到列表框时获取 StackOverflowException