2012-05-10 4 views
0

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 }); 
      } 

プログラムがフリーズ?

答えて

1

解決済みの問題私はずっと前に捕まえていたはずです。

私はバックグラウンドワーカーを取り除き、すべてをタイマーに入れました。まだ動作しませんでした。それから私はまだ "スレッド"タイマーを使用していたことに気付きました。

私は

System.Windows.Forms.Timer 

System.Timers.Timer 

から私のタイマーを切り替え、それが今で完璧に動作します。

関連する問題