OK..私のメインフォームは、他のフォームを開くいくつかのユーザーコントロールといくつかのボタンで構成されています。UIがフリーズしないバックグラウンドワーカーがあります。バックグラウンドワーカーはフォームの時計を更新し、特定の条件を満たすデータベースをチェックしています。条件が満たされると、このフォームは非表示になり、新しいフォームが表示されます。
また、2番目のフォームがすでに開いているかどうかを確認しています。一度開けたら閉めないから。非表示と表示を使用します。だから私の問題は、フォームを作成して開くための、またはフォームがすでに開いている場合はフォームを表示するためのスレッドセーフな方法を見つけることができないということです。また、現在のフォームを非表示にする必要があります。
これが私が持っているコードです
//bool variable to determine if i need to open the form
if (inShift)
{
frmInShift InShift = null;
if ((InShift = (frmInShift)IsFormAlreadyOpen(typeof(frmInShift))) == null)
{
InShift = new frmInShift();
InShift.RefToParent = this;
}
else
{
InShift.RefToParent = this;
}
InShift.ResetButtons();
InShift.Show();
this.Visible = false;
}
このコードが機能することはわかっています。フォームのボタンの1つで使用しています。これをスレッドセーフにする必要があります。問題の一部は、フォームがまだ開いていない場合に実際にフォームを作成することです。
メインスレッドでそのチェックを行う必要がありますか?それが機能する場合、Show()メソッドをどのように呼び出しますか?
編集:メインフォームの読み込みイベントで2番目のフォームを作成しています。したがって、私がする必要があるのは、いくつかのパブリック変数を設定し、フォームを表示してメインフォームを非表示にすることだけです。
私のRunWorkerCompletedコードは次のようになります。
if (inShift)
{
InShift.RefToParent = this;
InShift.ResetButtons();
InShift.Show();
//program freezes up here
this.Invoke(new ThisFormVisibleCB(ThisFormVisible), new object[] { false });
}
これでInvokeを呼び出してフォームを非表示にすると、プログラムがフリーズします。