1

mysqlサーバーへの接続を処理するlogin()メソッドを呼び出してから、ユーザーを認証しています。mysqlサーバーへの接続には時間がかかるので、「読み込み中」のステータスを示すラベルを付けたいと思います。私はその中で次のようなことをしています:

private void button_login_Click(object sender, EventArgs e)
{
    label_status.Text = "Loading ...";
    login();
}

しかし、label_statusテキストが「Loading...」に変更されているのがわかりません。代わりに、ログイン機能が戻った後、label_statusにこのステータスが表示されます。

なんでこれなのかわからない?これはスレッドの問題ですか?どんな助けでもいただければ幸いです。

4

2 に答える 2

4

UIスレッドは、イベントハンドラーの期間中ブロックされます。UIを更新できるようにする場合は、UI以外のスレッドで長時間実行されるタスクを実行する必要があります。はBackgroundWorker、これを行うために特別に設計されています。 これは、その使用方法に関するチュートリアルです。

を開始する前にテキストを設定し、実行するメソッドをBackgroundWorker設定する必要があります。ログイン後にUIの更新が必要な場合は、イベントでそれらを呼び出すことができます。DoWorkloginCompleted

完全なBGWソリューションを必要としない小規模なケースの場合は、タスク並列ライブラリを使用できます。これにより、単純なケースを単純なままにすることができます。TPLを使用するための標準モデルは次のとおりです。

private void button1_Click(object sender, EventArgs e)
{
    //UpdateUI with stuff to do before long running task

    Task.Factory.StartNew(() => someLongRunningNonUITask())
        .ContinueWith(task => updateUIWithResults(task)
           , TaskScheduler.FromCurrentSynchronizationContext());

}
于 2012-08-16T19:50:23.363 に答える
2

これを行うための手っ取り早い方法は、テキストを変更した後、login()メソッドを呼び出す前にApplication.DoEvents()を呼び出すことです。これにより、login()メソッドを呼び出す前にラベルが再描画されます。

private void button_login_Click(object sender, EventArgs e) 
{ 
    label_status.Text = "Loading ..."; 
    Application.DoEvents();
    login(); 
} 
于 2012-08-16T20:19:54.760 に答える