2009-04-09 14 views
1

私は奇妙なバグがあります。その理由について手がかりがあれば教えてください。ShowDialog、PropertyGrid、Timerの問題

私のメインフォームにTimerSystem.Windows.Forms.Timer)があります。これはいくつかの更新プログラムを起動し、最終的にメインフォームUIを更新します。それから私はShowDialog()メソッドを使ってメインフォームから開いたエディタを持っています。このエディターではPropertyGridSystem.Windows.Forms.PropertyGrid)です。

私は毎回それを再現することができませんが、頻繁にエディタのそのプロパティグリッドのドロップダウンを使用すると、それは固まってしまいます/キャンセルボタンはフォームを閉じず、プロパティグリッドは使用できなくなります。フォームヘッダーのボタンが機能しません。

バックグラウンドに例外はなく、私がプロセスを中断した場合、私は最初に述べた更新に関するいくつかの計算を行っていることがわかります。

お勧めできますか?どんなアイディアも大歓迎です。

+0

この問題の原因はこれまでに見つかりましたか? – roken

+0

@roken:私は忘れてしまった:-)私はモーダルダイアログがアクティブな間にUIを停止させるような回避策を使用したと思います... –

+0

悲しい日。返信いただきありがとうございます。私はあなたが3年前の問題を思い出すことは期待できません! – roken

答えて

1

スレッドタイマーのTickメソッドが別のスレッドで実行されないため、完了するまで他のスレッドをロックしています。

private void timer1_Tick(object sender, EventArgs e) 
{ 
    Thread.Sleep(6000); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    timer1.Start(); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    frmShow show = new frmShow(); 
    show.ShowDialog(); // frmShow just has some controls on it to fiddle with 
} 

そして実際、それはあなたが説明するようにブロックされた:私は、イベントこれをしなかったことにタイマーと2つのボタンを持っていたテストのWinFormsアプリを作りました。次のように解決しました:

private void timer1_Tick(object sender, EventArgs e) 
{ 
    ThreadPool.QueueUserWorkItem(DoStuff); 
} 

private void DoStuff(object something) 
{ 
    Thread.Sleep(6000); 
} 
+0

あなたの答えをありがとう、SnOrfus しかし、あなたが私の場合に説明しているようには見えません。 UIスレッドは計算によってブロックされません。私はエディタフォームの終了ハンドラに入ることができます。私はそれを踏むことができますが、フォームはそれの後ろに閉じません! –

+0

これはなぜ受け入れられましたか?回答?私たちはまったく同じ問題を抱えています。上記のコメントで言及したように、この問題は単にUIスレッドがハングアップしているためではありません。プロパティグリッドは完全に反応し、ボタンのクリックイベントは発生しますが、フォームは閉じられません。 – roken

関連する問題