Я проверил некоторые другие вопросы, и, очевидно, лучшее решение - это в первую очередь предотвратить поведение, вызывающее эту проблему, но проблема очень прерывистая и очень невоспроизводимая.
У меня, в основном, есть основная форма с вложенными формами. Подформы отображаются из меню и / или кнопок основной формы следующим образом:
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 времени, вызывает исключение, или, скорее, почему моя форма утилизируется?
У меня было подозрение, что сборщик мусора запутался, потому что он происходит немного чаще после того, как он работал в течение многих часов.