如何处理c#中未处理的对象释放异常?

如何处理c#中未处理的对象释放异常?,c#,exception,C#,Exception,我在c#windows应用程序中工作。我有两个名为form1和form2的窗口。我通过单击form1中的按钮调用form2,但我在form1的Constructor中为form2创建了对象。如果我第一次单击按钮form2成功显示,我将通过单击默认的关闭按钮关闭form2,然后再次单击按钮现在我正在处理对象。异常是未处理的异常。如何避免此情况?您保留了对对象的引用(此处的窗口),但正在关闭它。对象已被释放,但未被垃圾回收。您在此处的引用现在无效,因为对象已失去其可用状态 如果需要重复使用表单,则需

我在c#windows应用程序中工作。我有两个名为form1和form2的窗口。我通过单击form1中的按钮调用form2,但我在form1的Constructor中为form2创建了对象。如果我第一次单击按钮form2成功显示,我将通过单击默认的关闭按钮关闭form2,然后再次单击按钮现在我正在处理对象。异常是未处理的异常。如何避免此情况?

您保留了对对象的引用(此处的窗口),但正在关闭它。对象已被释放,但未被垃圾回收。您在此处的引用现在无效,因为对象已失去其可用状态


如果需要重复使用表单,则需要隐藏表单而不是关闭表单。或者创建一个新实例以再次加载它。

您可以使用事件让form1知道form2何时关闭并清除对它的引用。如果form1已经关闭,它就不需要调用form2。

我们在这里使用一些插入第三方应用程序的工具做了类似的事情。代码示例如下:

public class Form1 : Form
{
    private Form2 otherForm;

    private void ActivateForm2_Click(object sender, EventArgs e)
    {
        if (otherForm == null || otherForm.IsDisposed)
        {
            otherForm = new Form2();
            otherForm.FormClosed += new FormClosedEventHandler(otherForm_closed);
        }
        otherForm.Show(this);
    }

    private void otherForm_Closed(object sender, FormClosedEventArgs e)
    {
        otherForm.Dispose();
        otherForm = null;
    }
}

不要处理异常,修复代码中的错误。表单实例在表单关闭后已失效,您无法再次显示它。要么这样写:

    private void button1_Click(object sender, EventArgs e) {
        var frm = new Form2();
        frm.Show(this);
    }
或者,如果您只希望表单的一个实例始终可见:

    Form2 theForm;

    private void button1_Click(object sender, EventArgs e) {
        if (theForm != null) {
            theForm.WindowState = FormWindowState.Normal;
            theForm.BringToFront();
        }
        else {
            theForm = new Form2();
            theForm.FormClosed += delegate { theForm = null; };
            theForm.Show(this);
        }
    }

是的。最好的办法。触发Form_closed事件时,form2引用必须设置为null