0


0

.net Mobile FrameworkのC#-Windowsフォームプロパティは変更されません

ユーザー認証を必要とするC#アプリケーションを作成しています。

ユーザーがログインボタンを押すと、バックグラウンドでかなりの処理が行われますが、何かが発生していることや、プログラムがフリーズしていないことをユーザーに通知するのに苦労しています。

このようなものが実行されている間に、ログイン後に表示したい非表示のテキストフィールドがいくつかありますが、表示することはできません。

基本的に、ユーザーがログインボタンを押すと、資格情報が正しいかどうかが確認され、メッセージが表示されるはずです。次に、他の機能が実行され、その後に別のフォームが表示されます。

資格情報が確認され、ユーザーが有効であることがわかった後、これを実行してみました。

please_wait.Visible = true;

ただし、コード内のそのポイントに到達しても変更されません。 私はそれをスレッド化してみて、それが役立つかどうかを確認しました。 上記の行を呼び出す代わりに、それを行うスレッドを開始します。

それもうまくいきません。 フィールドはまだ表示されません。

スレッドを開始するか、Visibleプロパティを変更した後、関数から*右*に戻ると、正常に機能します。

どうすれば正常に動作し、変更後にさらにコードを実行できますか?

3 Answer


3


問題は、バックグラウンドスレッドからUIを更新する必要があるということではありません。 むしろ、バックグラウンドスレッドで長時間実行されるタスクを実行し、フォアグラウンドへの更新をマーシャリングする必要があります。 これは、進行状況を通知する「BackgroundWorker」を介して頻繁に行われます(たとえば、進行状況バー上)。

基本的に、UIのフォアグラウンドスレッドは、作業の実行中にロードまたはブロックされるため、ユーザーインターフェイスを更新するためにメッセージキュー内のメッセージを処理しません。


0


Gregが推奨していること(まだ行っていない場合、これは確かに最初のステップです)とともに、クォンタムをあきらめる必要があるかもしれません。

スケジューラに負担をかけている場合、UIの更新(優先度はかなり低い)が、ワーカーが完了するまで先取りされる可能性があります。 Application.DoEvents(または場合によってはバックグラウンドスレッドでThread.Sleep(1))を追加すると、UIにペイントするためのスケジューラー時間が少し与えられます。


0


Application.DoEvents()への呼び出しを追加しようとしましたか? これはハックですが、必要なのはそれだけです。