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