1

For change ラベル値を渡すときの単純なルーチンを使用しようとしています。1秒寝かせたけど何も起こらない

なぜこれが機能しないのですか?私はデバッグしていて、値がラベルに渡されるのを見ましたが、画面は変化しませんでした。

コード

Random rand = new Random();
int randomNumber = 0;

for(int i = 0 ; i < 4; i++)
{
    randomNumber = rand.Next(1, 10);
    System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));
    lblNumber.Text = Convert.ToString(randomNumber);
}

lblNumber.Text = Convert.ToString(randomNumber);
4

5 に答える 5

6

しかし、画面に変化はありません。

ユーザー インターフェイス スレッドをブロックしています。ラベルは、メソッドが完了すると 1 回だけ更新され、ユーザー インターフェイスはメッセージを適切に処理できます。

更新を確認したい場合は、この「作業」をバックグラウンド スレッドに移動し、呼び出しをマーシャリングしてテキスト ボックスを UI スレッドに戻す必要があります。

于 2013-03-15T20:10:57.397 に答える
2

UI Thread で Thread.Sleep を実行しても、表示が更新されることはありません (スリープ状態にすると、約 1 秒間、プロセッサでの時間を放棄するだけです)。

本当に更新をトリガーしたい場合Application.DoEvents()は、Thread.Sleep の代わりに: を呼び出すことを検討してください。これにより、UI スレッドが保留中のメッセージ (ラベルのテキストの変更による再描画メッセージを含む) を処理し、次にコントロールを再描画します。

ただし、どちらの方法も悪い習慣と見なされており、コードに何らかの問題があることを示していることを知っておく必要があります。

于 2013-03-15T20:12:02.180 に答える
1

ラベルのテキストを設定すると、「次にこのフォームの外観を更新するときに、ラベルを再描画する」ことがプログラムに伝えられます。ただし、描画を行うスレッドをスリープ状態にしているため、ウェイクアップするまでラベルを再描画していません。

ここでやりたいことは睡眠ではありません。UI スレッドで Sleep を呼び出している場合は、ほぼ間違いなく何か間違ったことをしています。

C# 5 を使用している場合は、メソッドasyncをマークしてから使用することで、この問題を解決できます。

await Task.Delay(whatever);

の代わりにThread.Sleep。「待機」とは、「非同期で何かを行うが、結果を待ってスリープ状態にならないことを意味します。代わりに、呼び出し元に制御を返します。非同期操作が完了すると、再開するように指示するメッセージが UI スレッドに送信されます。あなたが中断したこの方法」。

を使用するには、待機awaitのメソッドがorまたはを返す必要があります。voidTaskTask<T>

于 2013-03-15T20:49:48.890 に答える
0

電話してみることができます

randomNumber = rand.Next(1, 10);
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));
lblNumber.Text = Convert.ToString(randomNumber);
lblNumber.Refresh();
于 2013-03-15T20:12:50.853 に答える
-1

これは、UI の更新が別のスレッドで実行されるために発生します。別のスレッドを使用しない限り、ラベルの変更は表示されません。これを行うには、 BackgroundWorkerを使用できます。

于 2013-03-15T20:12:34.363 に答える