0

私がやろうとしているのは、リモート データベースとの接続を使用して取得され、フォームに表示される値の代わりに「お待ちください..」を表示することです。このプロセスでは、次のような簡単なコードを書きました。

   private void button1_Click(object sender, EventArgs e)
        {
             c.Text = "Please wait...";
            SqlCommand cmd1 = new SqlCommand();
.
.
.
.
}

コードをデバッグしたところ、行の変更c.Textが実行されたことがわかりましたが、どういうわけかフォームがフリーズしており、接続が確立され、クエリが実行され、データがフェッチされた後にのみ変更されます。

スレッド化を使用していないため、UI がスタックすることは理解していますが、それにもかかわらず、ラベルがスタックする直前に変更されない原因は何ですか?

4

2 に答える 2

2

割り当てによってテキストが設定されc.Textますが、再描画メッセージは onclick ハンドラーの終了後に処理されます。

これを試して:

    private void button1_Click(object sender, EventArgs e)
    {
         c.Text = "Please wait...";
         Application.DoEvents();
         SqlCommand cmd1 = new SqlCommand();

しかし、UI スレッドでブロック操作を実行するのは悪い習慣だと言わざるを得ません。(これにより、イベントハンドラーからのイベントの処理を要求するため)

特にこの場合: このパターンは無限ループまたはデッドロックを引き起こす可能性があるためです。

ワーカースレッドでデータベース操作を実行するか、.NET 4.5のasyncおよびパターンを使用することをお勧めします。await

于 2013-11-05T12:12:17.033 に答える
2

追加すると

this.Refresh();

テキストを設定すると、フォームが無効になり、更新されます。

于 2013-11-05T12:13:03.017 に答える