0

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を呼び出してフォームを非表示にすると、プログラムがフリーズします。

4

1 に答える 1

1

解決しました..ずっと前に見つけたはずのばかげた問題。

手始めに..バックグラウンドワーカーを取り除き、すべてをタイマーに入れました..それでも機能しませんでした。その後、まだ「スレッド化」タイマーを使用していることに気付きました。

タイマーを

System.Timers.Timer 

System.Windows.Forms.Timer 

そしてそれは今完全に機能します。

于 2012-05-10T22:09:31.983 に答える