我检查了其他一些问题,显然最好的解决方案是首先防止导致此问题的行为,但问题是非常间歇性的,并且非常不可重现。
我基本上有一个主表格,有子表格。子表单从主表单的菜单和/或按钮中显示,如下所示:
private void myToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
xDataForm.Show();
xDataForm.Activate();
}
catch (ObjectDisposedException)
{
MessageBox.Show("ERROR 10103");
ErrorLogging newLogger = new ErrorLogging("10103");
Thread errorThread = new Thread(ErrorLogging.writeErrorToLog);
errorThread.Start();
}
}
并且子表单实际上是主表单(无论好坏。我实际上想改变它,但这样做需要相当长的时间):
public partial class FormMainScreen : Form
{
Form xDataForm = new xData();
...(lots more here)
public FormMainScreen(int pCount, string pName)
{
InitializeComponent();
...
}
...
}
修改了子表单的 Dispose 功能,“关闭”和“X”按钮实际上隐藏了表单,因此我们不必每次都重新创建它。当主屏幕关闭时,它设置了一个“标志”为2,所以其他窗体知道关闭实际上是可以的;
protected override void Dispose(bool disposing)
{
if (FormMainScreen.isExiting == 2)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
else
{
if (xData.ActiveForm != null)
{
xData.ActiveForm.Hide();
}
}
}
所以,问题是,为什么这会一次又一次地完美无缺地工作,但是,从字面上看,大约每 1/1000 的时间会导致异常,或者更确切地说,为什么我的表单会被处理?
我怀疑垃圾收集器被搞糊涂了,因为它在运行了几个小时后发生的频率稍微高了一点。