2017-09-08 5 views
2

Ich muss verstehen, wie ich Verzögerungen zwischen einer Reihe von Befehlen erstellen kann. Mein Hintergrund ist mit C (DOS) und die Wiederbelebung nun die Konzepte C# in Visual Studio 2015 verwenden Dies ist der Code, mit denen ich zu kämpfen:Verzögerungsfunktion in C#

using System.Threading; 

private void button1_Click(object sender, EventArgs e)  // Button 
{ 
    int i; 
    for (i = 0; i < 10; i++) 
    { 
     textBox1.BackColor = Color.Red; 
     Thread.Sleep(100); 
     textBox1.BackColor = Color.Yellow; 
     Thread.Sleep(100); 
    } 
} 

ich die Hintergrundfarbe der Textbox erwartet, wird alternativ 10 mal ändern aber ich konnte nur gelbe Farbe sehen, nachdem die Schleife fertig ist. Wenn ich die Verzögerung vergrößere, merke ich, dass das Programm Zeit braucht, um zu beenden. Ich habe einige verwandte Artikel durchgelesen, aber ich konnte den Punkt nicht verstehen. Jede Hilfe wird geschätzt. Danke

+3

WinForms ist single-threaded und Ihr Aufruf an 'Thread.Sleep' wird den Thread blockieren. Sie müssen vermeiden, den UIhread zu blockieren. Das Textfeld ändert nur dann die Farbe, wenn die Steuerung zum Window-Message-Handler 'WM_PAINT' übergeht, der in Ihrem Code nie vorkommt. – Dai

+1

Werfen Sie einen Blick auf [diesen Artikel] (http://stackoverflow.com/editing-help), um zu erfahren, wie man den Codeblock verwendet. –

Antwort

3

Verwenden Sie eine asynchrone Methode, um eine Verzögerung mit der integrierten Methode Task.Delay zu erstellen. Dies führt dazu, dass die Ausführung pausiert wird und nach der angegebenen Zeit ohne angehalten wird, um den aktuellen Thread zu blockieren.

async Task UseDelay() 
{ 
    await Task.Delay(1000); // wait for 1 second 
} 

In Ihrem speziellen Fall

button1_Click(object sender, EventArgs e) // Button 
{ 
    for (var i = 0; i < 10; i++) 
    { 
     textBox1.BackColor = Color.Red;   
     await Task.Delay(100); 
     textBox1.BackColor = Color.Yellow;  
     await Task.Delay(100); 
    } 
} 
+1

Ich habe diesen Code verwendet und die gewünschten Ergebnisse erzielt. Ich konnte diese Philosophie auch anwenden, um Joystick in gewünschten Intervallen abzufragen. Dank Aluan für den modifizierten Code und Chad für das Konzept, –

4

Das Problem ist nicht mit der Verzögerung ist, dann ist es mit dem Threading-Modell von UI-Anwendungen. In einer UI-Anwendung werden Event-Handler auf dem "UI-Thread" ausgeführt. Während dieser Code ausgeführt wird, ist die Benutzeroberfläche im Wesentlichen eingefroren, sodass Sie nichts tun müssen.

Das bedeutet, wenn Sie dort "schlafen", wird die gesamte Anwendung gesperrt und reagiert nicht, bis es zurückkehrt.

Aber Sie können Ihre Event-Handler "async void" statt nur "void" machen, wenn sie lange laufende Arbeit machen müssen. Dann, wenn Sie await Task.Delay(someTime) anstelle von Thread.Sleep(someTime), wird es den UI-Thread freigeben, während das passiert. Und Sie sollten sehen, was Sie erwarten, ohne dass die Benutzeroberfläche gesperrt wird.

Auch diese Zeit ist in Millisekunden, was bedeutet, "eine Zehntelsekunde" zu warten. Was wirklich, wirklich schnell ist. Vielleicht möchten Sie es etwas verlangsamen, um den gewünschten Effekt zu erzielen.

Verwandte Themen