C# 无法访问已释放的对象

C# 无法访问已释放的对象,c#,forms,object,dispose,C#,Forms,Object,Dispose,我的程序有多种形式。第五个也是最后一个表单有一个按钮,单击该按钮时,将使用application.Exit()方法关闭应用程序。但是,每次单击按钮时,我都会收到错误“无法访问已处置对象”,在我的第一张表单上,该错误围绕着此代码: frm2 f2 = new frm2(); this.Hide(); f2.ShowDialog(); this.Show(); 编译器指出语句this.show()是问题所在。有人能解释一下我

我的程序有多种形式。第五个也是最后一个表单有一个按钮,单击该按钮时,将使用application.Exit()方法关闭应用程序。但是,每次单击按钮时,我都会收到错误“无法访问已处置对象”,在我的第一张表单上,该错误围绕着此代码:

 frm2 f2 = new frm2();
            this.Hide();
            f2.ShowDialog();
            this.Show();

编译器指出语句
this.show()
是问题所在。有人能解释一下我为什么会收到这个错误以及如何修复它吗?

好的,编辑了我的答案,我复制了你的问题。如果要使用
Form.ShowDialog
,则应设置关闭应用程序的控件的DialogResult。因此,在按钮属性中,您应该将对话框结果设置为某个值,例如
Cancel

然后在按钮上单击事件,您将执行以下操作:

    private void btnClose_Click(object sender, EventArgs e)
    {
        if (this.DialogResult == DialogResult.Cancel)
        {
            Application.Exit();
        }
    }

否则,如果您不需要使用
Form.ShowDialog
,您可以只显示Form2。上述情况不会在我的测试中产生错误。

在您的代码示例中,
frm2
是否调用了
应用程序。是否退出?如果有,那么为什么您要再次调用this.Show

无论如何,您可能会遇到与如何启动应用程序的消息循环有关的问题。您正在运行
Application.Run()
,还是
Application.Run(form1)


如果在启动消息循环时向
Application.Run()
提供了一个表单,则不应调用
Application.Exit
以退出应用程序。相反,您应该简单地关闭主窗口,这将导致消息循环完成,对
应用程序的调用将返回
,您的应用程序将干净地终止。

这是
this.Hide()行吗正在引发异常的原因?可能是显示最终表单的表单(
this
)已被释放。此示例中似乎缺少很多代码,因此很难诊断确切的问题。引发异常的是哪一行?我是T.S.-在四行代码中有三个单独的表单变量?我的错,应该是f2.ShowDialog()。无论如何,返回错误的行是this.show();您是否正在使用
应用程序。代码中的任何地方都有事件吗?这没有意义。您不需要对刚创建的表单调用
Hide
,也不需要调用
Show
来显示模型对话框。这里不需要这两个调用。如果希望应用程序干净地终止,最好只关闭表单。如果您的主消息循环是使用此表单上的
Application.Run(form1)
启动的,则应用程序将干净地退出。如果不是,那么我将从Main中为表单的
Closed
事件附加一个处理程序,该事件将调用
Application.Exit
。重点是-forms不应该是调用Exit的表单。对Application.Exit()的调用是从我的第五个也是最后一个表单开始的。