他のいくつかの質問をチェックアウトしましたが、明らかに最善の解決策は、そもそもこの問題を引き起こす動作を防ぐことですが、問題は非常に断続的であり、再現性が非常に低いです。
私は基本的にメインフォームとサブフォームを持っています。サブフォームは、メインフォームのメニューやボタンから次のように表示されます。
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 の確率で例外が発生するというか、なぜ私のフォームが破棄されるのでしょうか?
ガベージ コレクタが混乱している疑いがありました。これは、ガベージ コレクタが何時間も実行されていると発生頻度がわずかに高くなるためです。