Ok。私のメインフォームは、いくつかのユーザーコントロールと他のフォームを開くいくつかのボタンで構成されています。 UIがフリーズしないバックグラウンドワーカーがいます。バックグラウンドワーカーは、フォーム上の時計を更新し、特定の条件を満たすためにデータベースをチェックしています。条件が満たされると、このフォームは非表示になり、新しいフォームが表示されます。Form.Show()とForm.Visible ThreadSafe
また、2番目のフォームが既に開いているかどうかを確認しています。一度それを開くと、私はそれを閉じないので。私はhideとshowを使うだけです。だから私の問題は、フォームを作成して開くためのスレッドセーフな方法が見つからず、既に開いている場合にフォームを表示することができないということです。私はまた、現在のフォームを非表示にする必要があります。ここで
は私が、私は、フォーム上のボタンのいずれかでそれを使用しています、このコードは動作します知っている
//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;
}
を持っているコードです。私はこのスレッドセーフなものにする必要があります。問題の一部は、まだ開いていない場合は実際にフォームを作成しています。
メインスレッドでそのチェックを行う必要がありますか?それが動作する場合、どのようにShow()メソッドを呼び出すのでしょうか?
EDIT: メインフォームのロードイベントで2番目のフォームを作成しています。だから私がする必要があるのは、いくつかのパブリック変数を設定し、フォームを表示してメインフォームを隠すことだけです。
マイRunWorkerCompletedコードは次のようになります。私はform..helpを非表示にするには、この上の呼び出しを呼び出すとき
if (inShift)
{
InShift.RefToParent = this;
InShift.ResetButtons();
InShift.Show();
//program freezes up here
this.Invoke(new ThisFormVisibleCB(ThisFormVisible), new object[] { false });
}
プログラムがフリーズ?