1

これは私が書いた簡単なコードです:

private void button1_Click(object sender, EventArgs e)
{
    label1.Text = "first";
    Thread.Sleep(1000);
    label1.Text = "second";
}

ただし、ラベルには「最初」は表示されません。ブレークポイントを使用してチェックすると、ステートメント label1.text="first" が実行されますが、ラベルに「first」は表示されず、「second」のみが表示されます。

これはなぜですか?

4

3 に答える 3

10

これは、メイン スレッドをスリープ状態にするためです。したがって、新しいテキストをラベルにペイントすることはできません。

以下を使用して、キュー内の (ペイント) イベントの処理を「強制」できます。

Application.DoEvents();
Thread.Sleep(1000);

ただし、この質問「Application.DoEvents() の使用」をお読みください。

于 2012-07-20T09:32:08.427 に答える
2

実行された瞬間Thread.Sleep、UI スレッドはスリープ状態になります。そのため、UI の更新を担当するコードは実行されず (button1_Clickメソッドが返されるとすぐに実行できます)、結果は表示されません。

于 2012-07-20T09:32:21.990 に答える
0

私が学んだことから、コンパイラーは最初にコンパイルするのに最適な行を選択します。したがって、label1.Text = "second"とコメントすると、1秒の遅延後にラベルに"first"が表示されます。これを行うことでそれを証明できます:

private void button1_Click(object sender, EventArgs e)
{
    label1.Text = "first";
    Thread.Sleep(1000);
    if (label1.Text == "first")
    {
        label1.Text = "second";
    }
}

label1.Textが「first」に設定されているため「second」と表示されますが、スリープ後に発生するため、表示されないため、短すぎます。

于 2012-07-20T09:47:04.737 に答える