2016-11-10 9 views
2

ich dies tun:Code wird nicht vor dem Thread-Schlaf ausgeführt?

clear(); 
coinRefundComplete.Visible = true; 
state = 0; 

System.Threading.Thread.Sleep(4000); 
clear(); 

greeting.Visible = true; 
rate.Visible = true; 
refundTicket.Visible = true; 
currentTime.Visible = true; 

Ich erwarte, dass die coinRefundComplete Text (es ist ein Label) für 4 Sekunden angezeigt, dann durch eine Methode, die ich mit klar definierten gelöscht get(), und dann einige andere Sachen passiert. Stattdessen nachdem ich mein Formular mit dem ersten clear() gelöscht habe, ist mein Formular für 4 Sekunden leer und wird ordnungsgemäß beendet.

+0

ist es winforms ?? –

+1

Sie blockieren den UI-Thread. Änderungen sind nicht sichtbar und Sie sollten sie niemals blockieren. Verwenden Sie einen Timer, wenn Sie etwas für einen Moment zeigen möchten. –

+1

Wenn der gesamte Code innerhalb einer Methode ist, wird das Formular erst aktualisiert, wenn die Methode vollständig ausgeführt wird. – Fabio

Antwort

0

Obwohl in dem Schlaf den GUI-Thread setzt nie wünschenswert ist, aber so dass der GUI-Thread des Steuerzustand aufzufrischen vor dem Schlafengehen wird zeigen, Sie die Änderungen, die Sie wollen. Rufen Sie Control.Update oder Control.Refresh auf, nachdem Sie es sichtbar gemacht haben und bevor Sie schlafen gehen, damit der GUI-Thread Änderungen anzeigen kann, bevor er in den Ruhezustand wechselt.

clear(); 
coinRefundComplete.Visible = true; 
label1.Update(); 
state = 0;  
System.Threading.Thread.Sleep(4000); 
clear(); 

sollten Sie vorsichtig sein, während Thread.Sleep Verwendung In Ihrem Fall ist es GUI-Thread und GUI für die Zeit, die Sie schlafen irresponsive sein wird. Zu wissen, warum Sie den Thread blockieren möchten, könnte einen anderen besseren Vorschlag liefern.

bearbeiten

Sie anderen Thread Verzögerung für das Hinzufügen ohne Blockierung der GUI-Thread verwenden können. Wenn Sie Framework 4.5 verwenden können, können Sie async/await konstruieren oder lesen Sie diesen Artikel Using async/await without .NET Framework 4.5.

private async void testAsyncAwaitDely_Click(object sender, EventArgs e) 
{ 
    clear(); 
    coinRefundComplete.Visible = true; 
    state = 0; 
    await Task.Delay(4000); 
    clear(); 
    //Your code 
} 
10

Verwenden Sie async/await Ansatz.
Machen Sie Ihre Methode async - unter Beispiel für Eventhandler der Schaltfläche

private async void ButtonClick(object sender, EventArgs e) 
{ 
    clear(); 
    coinRefundComplete.Visible = true; 
    state = 0; 

    await Task.Delay(4000); 
    clear(); 

    greeting.Visible = true; 
    rate.Visible = true; 
    refundTicket.Visible = true; 
    currentTime.Visible = true; 
} 

On line await Task.Delay(4000); UI-Thread freigeben wird klicken, die alle Änderungen bevor gemacht aktualisieren wurden. Nach 4 Sekunden wird die Methode im UI-Thread weiter ausgeführt.

+0

Danke, das ist, was ich gesucht habe. Ich habe mehrere Fragen und Antworten mit dieser Technik gefunden, aber keiner von ihnen wies darauf hin, dass ich der Methodendefinition des Button-Klicks "async" hinzufügen musste. – 73est

+0

Obwohl diese Implementierung meiner Meinung nach besser ist, da sie die Benutzeroberfläche nicht einfriert, habe ich die andere Antwort als korrekt markiert, weil sie eine Lösung mit der gleichen Idee wie meine ursprüngliche Frage bot (wenn auch nicht so gut wie eine Gesamtlösung). – 73est

+1

@ 73est - Die andere Lösung ist eine schlechte Idee. Es funktioniert nicht garantiert.Sie sollten niemals den UIhread nur schlafen. Diese Antwort ist viel besser. – Enigmativity

-2

Ihre Benutzeroberfläche wird nicht aktualisiert, da Sie die gesamte Verarbeitung im UI-Thread durchführen, sodass der UI-Thread keine Möglichkeit erhält, die UI-Elemente zu aktualisieren. Sie müssen die Application.DoEvents()-Funktion an einem beliebigen Ort aufrufen, an dem die UI aktualisiert und mit den neuesten Änderungen geladen werden soll. Hier ist Ihr modifizierter Code. Ich habe eine Zeile Code hinzugefügt vor dem Schlafengehen auf dem aktuellen UI-Thread rief:

 clear(); 
     coinRefundComplete.Visible = true; 
     state = 0; 

     //new line of code 
     System.Windows.Forms.Application.DoEvents(); 

     System.Threading.Thread.Sleep(4000); 
     clear(); 

     greeting.Visible = true; 
     rate.Visible = true; 
     refundTicket.Visible = true; 
     currentTime.Visible = true; 
+0

"Application.DoEvents()" aufzurufen ist einfach schlecht. Sehr schlecht. Es kann alle Arten von Wiedereintrittsfehlern verursachen. Es ist nur aufgrund der Rückwärtskompatibilität mit VB6 verfügbar. Vermeiden Sie es um jeden Preis. – Enigmativity

Verwandte Themen