please_wait.Visible = true;
0
0
ユーザー認証を必要とするC#アプリケーションを作成しています。
ユーザーがログインボタンを押すと、バックグラウンドでかなりの処理が行われますが、何かが発生していることや、プログラムがフリーズしていないことをユーザーに通知するのに苦労しています。
このようなものが実行されている間に、ログイン後に表示したい非表示のテキストフィールドがいくつかありますが、表示することはできません。
基本的に、ユーザーがログインボタンを押すと、資格情報が正しいかどうかが確認され、メッセージが表示されるはずです。次に、他の機能が実行され、その後に別のフォームが表示されます。
資格情報が確認され、ユーザーが有効であることがわかった後、これを実行してみました。
please_wait.Visible = true;
ただし、コード内のそのポイントに到達しても変更されません。 私はそれをスレッド化してみて、それが役立つかどうかを確認しました。 上記の行を呼び出す代わりに、それを行うスレッドを開始します。
それもうまくいきません。 フィールドはまだ表示されません。
スレッドを開始するか、Visibleプロパティを変更した後、関数から*右*に戻ると、正常に機能します。
どうすれば正常に動作し、変更後にさらにコードを実行できますか?
3 Answer
3
問題は、バックグラウンドスレッドからUIを更新する必要があるということではありません。 むしろ、バックグラウンドスレッドで長時間実行されるタスクを実行し、フォアグラウンドへの更新をマーシャリングする必要があります。 これは、進行状況を通知する「BackgroundWorker」を介して頻繁に行われます(たとえば、進行状況バー上)。
基本的に、UIのフォアグラウンドスレッドは、作業の実行中にロードまたはブロックされるため、ユーザーインターフェイスを更新するためにメッセージキュー内のメッセージを処理しません。
0
Gregが推奨していること(まだ行っていない場合、これは確かに最初のステップです)とともに、クォンタムをあきらめる必要があるかもしれません。
スケジューラに負担をかけている場合、UIの更新(優先度はかなり低い)が、ワーカーが完了するまで先取りされる可能性があります。 Application.DoEvents(または場合によってはバックグラウンドスレッドでThread.Sleep(1))を追加すると、UIにペイントするためのスケジューラー時間が少し与えられます。
0
Application.DoEvents()への呼び出しを追加しようとしましたか? これはハックですが、必要なのはそれだけです。