C# Threading.Sleep Fehler?

... komplette Frage anzeigen

4 Antworten

Eigentlich ist dein Problem relativ einfach zu erklären. An sich hat es nichts mit Threads (auch wenn die Abhilfe schaffen können - je nach Aufgabe) oder der Programmiersprache zu tun, wie manche glauben.

Vorweg: du hättest das selbe Ergebnis, wenn du statt "Thread.Sleep" eine andere Methode aufrufst, die zur Ausführung eine spürbare Zeit in Anspruch nimmt.

Die Ursache liegt in der Message-Queue, die nicht schnell genug verarbeitet wird. Du stellst die Visible-Eigenschaft deines Steuerelementes auf True, wodurch du ein Ereignis auslöst. Bevor das übergeordnete Steuerelement aber seinen Inhalt für ungültig erklärt und neugezeichnet/dargestellt hat (d.h. die Auswirkung deiner Änderung auf Visible = True sichtbar werden) schickst du den Thread bereits in den Schlafmodus.

Eine Lösung wäre zum Beispiel "Bild.Parent.Refresh" oder "Me.Refresh" unmittelbar nach "Bild.Visible = True" zu schreiben. Damit erzwingst du das Neuzeichnen und wartest mit der weiteren Abarbeitung auf Beendigung des Neuzeichnens.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von CrystalixXx
11.03.2016, 18:37

Kleine Ergänzung:

Application.DoEvents schafft zwar auch Abhilfe, aber wenn man der Meinung ist, man braucht eine solche Anweisung, ist das ein gutes Zeichen für eine falsche Herangehensweise. Dann sollte man lieber über Threads nachdenken - wo dann die Antwort von KnusperPudding ins Spiel kommt.

0
Kommentar von Requi
22.03.2016, 10:51

So weit ich weiß, lässt die Methode "Invalidate();" das Event FormPaint aufrufen, was somit auch zu einem Redrawing resultiert.

0

Mit diesen problemen musst du halt leben. Das selbe ist es in vb, c, c++.. Nur python sieht da meines wissen gut aus und bash, sh..  Die sleep funktion sollte nur am ende einer void, int etc.. Vorkommen

Antwort bewerten Vielen Dank für Deine Bewertung

Bin zwar kein C# Programmierer, aber das "Problem" ist nicht nur da bekannt. 

Warum das so ist, ist relativ einfach: 

Drückst du auf einen Button, wird der GUI-Thread pausiert. Die Anweisung deines Buttons wird ausgeführt und anschließend wird der GUI-Thread fortgesetzt. 

Du könntest es lösen, indem du die beiden Zeilen: Thread.sleep() und Messagebox.show in einem neuen Thread startest. In Java würde das so aussehen:

private void click() {
    bild.setVisible(true);
    new Thread(new Runnable() {

@Override public void run() { Thread.sleep(1000); JOptionPane.showMessageDialog(null, "Text"); } }).start(); }
Antwort bewerten Vielen Dank für Deine Bewertung

ich kann mir das nur so erklären.

du hast das using vergessen.

using system.threading;

bekommst einen error und debugst einen build bevor du das sleep eingebaut hast.

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?