2012-03-20 8 views
0

私のwinformアプリケーションでは、「Please wait ...」メッセージがプログレスバーまたはテキストと共に表示されます。パフォーマンス上の理由から、FormはBringToFront()、Show()、およびRefresh()を使用して開いたシングルトンであり、Hide()で閉じられます。フォームが最終的にブロックされているにもかかわらず、フォームが非表示にならない場合があります

私はこのフォームを表示して非表示にするtry ... finallyパターンを使用しています。

try 
{ 
WaitForm.Display(); 
// Some code 
} 
finally 
{ 
WaitForm.Hide(); 
} 

ごくまれに、ユーザーがフォームが閉じなかったと報告しました。フォームが閉じない理由を考えてもらえますか?これが起こると、ユーザーインターフェイスは応答します。

+0

このバグは再現できますか?私はそれがなぜ呼ばれていないのかわからない... – squelos

+1

これは最終的にブロックのすべてのコードですか? 'WaitForm.Hide();の前にいくつかのコード行がありますか? – Steve

+1

@squelos:finallyブロックのコードは* always *呼び出されます。 'WaitForm.Hide()'が呼び出されない唯一の方法は、 'finally'ブロックを抜ける(例外を投げてしまうかもしれない)、またはフォームを隠すことによって例外自体が発生するということです。 –

答えて

1

通常、Windowsアプリケーションでは、UIリフレッシュのために、メインメッセージループを実行する必要があります。したがって、あなたのケースでは、このコードブロックの後にタイトなループ/処理が起こると、フォームがすぐに隠されないことがあります。

おそらく、コードブロックの後にUIスレッドを生成して、UIをリフレッシュできるようにすることができます。たとえば、

try 
{ 
    WaitForm.Display(); 
    // Some code 
} 
finally 
{ 
    WaitForm.Hide(); 
    Application.DoEvents(); 
} 
+1

これが当てはまるとは確信していません。たとえば、フォームが閉じず、ユーザーが自由にその下のデータグリッドビューをスクロールしていることを確認しました。待機フォームは、datagridviewコントロールにデータを格納したSQLクエリに使用されました。 – Nezreli

+1

@Nezreliは、おそらく 'WaitForm.Hide'を呼び出して、それ自体が例外をスローしています。 try-catchをfinallyブロックに入れて例外をキャッチしてログに記録することで確認できます。非表示UIスレッド(またはフォームが作成されて表示されているスレッドとは別のスレッド)で呼び出された可能性がありますが、そのような場合には、形。 – VinayC

+0

Application.DoEvents()メソッドがこの問題を解決しました。ありがとう。 – Nezreli

関連する問題