-3

重複の可能性:
Thread.sleep()がこのように動作するのはなぜですか

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

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

このコードが実行され、ボタンがクリックされると、label1はテキストを「2番目」としてのみ表示し、「最初」としては表示しません。ブレークポイントを使用してチェックしたところ、ステートメントlabel1.text = "first"が実行されましたが、labelに「first」が表示されません。なんでそうなの?

4

4 に答える 4

3

シングルスレッドアプリケーションを実行しています。label1オブジェクトのTextプロパティを"first"に設定するステートメントが実行されましたが、メインアプリケーションスレッドを一時停止させているため、"WindowsMessagePump"は実行されていません。

于 2012-07-20T10:24:41.503 に答える
3

コードが UI スレッドで実行されているためです。

アプリが実行されていて、何もクリックしていないとき、アプリケーションのメイン スレッドは、イベントを待ったり、Windows メッセージを処理したり、画面を描画したりして急いでいます。ボタンをクリックすると、アプリはそれらの処理を停止し、代わりに関数を実行します。メソッドの実行中は、画面を描画できません。関数はラベルを「First」に設定し、スレッドを 1 秒間ブロックしてから、ラベルを「second」に設定します。

戻ると、制御がアプリケーションに戻り、フォームを自由に再描画できます。「second」ラベルを使用して再描画します。メッセージ ループには、「最初の」ラベルを付ける機会がありませんでした。

于 2012-07-20T10:21:49.463 に答える
1

問題は、ここで UI スレッドをフリーズすることです。

「first」というテキストが設定されていますが、メインの GUI スレッドをスリープ状態にするため、UI は描画されません。

スリープ フェーズが終了すると、テキスト「second」が設定され、UI が描画されます。

これは Windows の仕組みなので、別の方法で行う必要があります。たとえば、スレッド、またはバックグラウンドワーカーを使用する

于 2012-07-20T10:21:30.140 に答える
0

遅延が必要な場合は、タイマーを使用してください。

UI に結果が表示されないのは、Dipatcher の優先順位によるものです。レンダリング タスクは、実行よりも優先度が低くなります。

これはあなたを助けます:タイマー!

DispatcherTimer dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 1);
dispatcherTimer.Start();

private void dispatcherTimer_Tick(object sender, EventArgs e)
{
//your code goes here
}

WPF で作業している場合は、これを試すことができます。

private void button1_Click(object sender, RoutedEventArgs e)
{
    label1.Text = "first";
    Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.ContextIdle);
    Thread.Sleep(1000);                            
    label1.Text = "second";
}
于 2012-07-20T10:21:00.533 に答える