2009-09-21 10 views
20

Also Thread.Sleep() ist schlecht (http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx).Alternativen zu Thread.Sleep() zum Simulieren von Pausen

Gibt es eine empfohlene Alternative zum Simulieren einer Pause bei der Ausführung eines Programms? ZB eine Schleife? Obwohl ich glaube, dass dieses eine Menge Aufwand beinhaltet Variablen in der Initialisierung, die Überprüfung der Bool Zustand etc.

Dank

+9

Ich möchte diesen Artikel upvote, aber ich kann nicht. StackOverflow hat den Rest des Internets für mich ruiniert. – MusiGenesis

+0

Ich möchte diesen Artikel erklären, warum 100% CPU-Nutzung in einer kontinuierlichen Worker-Schleife eine bevorzugte Alternative zu Thread.Sleep (1) ist. – StingyJack

Antwort

0

glaube ich, Raymond Chen den Faden Priorität niedriger

http://blogs.msdn.com/oldnewthing/archive/2009/07/27/9849503.aspx

gesetzt hat empfohlen

Ich verstehe nicht ganz, warum Sie so oft pausieren wollen. Warum nicht einfach mit niedriger Priorität arbeiten? Wenn es wichtigere Dinge zu tun gibt, hört der Hintergrund-Thread auf, was auch immer er tut. Wenn es eine verfügbare CPU gibt, wird Ihr Hintergrund-Thread seine Sache so schnell wie möglich erledigen (bis etwas mit höherer Priorität ankommt).

+0

Seine Empfehlung bezieht sich auf die "dritte" Nutzung des Schlafes - um den Betrieb zu verlangsamen und nicht zu viel CPU-Zeit zu verbrauchen. Die Frage ist, Pausen zu simulieren, was die perfekte Verwendung für Thread.Sleep ist. Die zweite Verwendung, die der Artikel in einer anderen Antwort diskutiert, ist das Polling - und das ist schlecht. – configurator

2

Wenn Sie darauf warten, dass ein bestimmter Code oder ein Ereignis auftritt, können Sie Wait Handles verwenden.

+0

können Sie sogar Waithandles anstelle von Thread.Sleep (Zeit) verwenden, um periodische Logik zu machen. – Alan

3

Ich bin nicht der Einschätzung, dass Thread.Sleep() ist "schlecht". Es hängt von der Situation ab.

In einem Konsolen-Modus-Programm kann es durchaus angemessen sein, den Thread zu schlafen, wenn Sie auf etwas warten. Vielleicht sogar in einer Schleife: Überprüfen Sie den Zustand, schlafen Sie ein wenig, wenn es nicht zufrieden ist, wiederholen.

In einem grafischen Programm würden Sie jedoch normalerweise nicht auf dem Hauptthread (GUI) schlafen. Dies liegt daran, dass heutzutage GUI-Schnittstellen mit einem einzigen interaktiven Thread entworfen werden. Wenn Sie in diesem Thread schlafen, scheint Ihre gesamte GUI für die Zeit, in der Sie schlafen, zu sperren. Eine bessere Situation könnte eine Art Timer sein (alle GUI-Frameworks haben ein solches Konzept).

Eine Sache, die Sie tun nicht wollen Sie tun, ist eine Schleife schreiben, die ständig nach einer Bedingung überprüft, um wahr zu sein, ohne sogar zu schlafen. Dies führt dazu, dass eine CPU zu 100% läuft, weil die CPU ihre Arbeit so schnell wie möglich erledigen will. Dies ist nicht nur aus Benutzersicht unerwartet, aber es ist unfreundlich, weil eine solche Aktivität den Prozess, auf den Sie eigentlich warten, von genügend Zyklen verhungern kann, um seine Arbeit erledigt zu bekommen!

+2

Dafür gibt es Synchronisationsgrundelemente. Das ist der springende Punkt des Blogposts. – ebo

+0

Aber "Simulation einer Pause in der Ausführung eines Programms" ist nicht was Synchronisierungsgrundelemente sind. Das ist der springende Punkt der ** Frage **. –

+1

Aber Sie schreiben, es ist in Ordnung, es für die Kommunikation zu verwenden, was es nicht ist. – ebo

4

Von dem, was Sie gesagt haben, versuchen Sie eine Pause in der Ausführung zu simulieren.

Thread.Sleep ist perfekt dafür gültig. Selbst der Artikel, den Sie verlinkt haben, beginnt mit:

Thread.Sleep hat seine Verwendung: Simulation langwieriger Operationen beim Testen/Debuggen auf einem MTA-Thread.

12

Wenn Sie nur eine Pause (wie in zu Testzwecken) simulieren gehen werden, ich denke Thread.Sleep ein absolut gültiger Ansatz. Auf der anderen Seite, wenn Sie tatsächlich auf etwas warten, wäre eine Art thread-safe Signaling-Mechanismus besser (überprüfen Sie die Typen, die erbt WaitHandle).

6

eine Pause simuliert

"Simulieren" klingt wie etwas, würden Sie nur bei der Fehlersuche tun. Thread.Sleep sollte in Ordnung sein.

Das Hauptproblem mit Sleep ist, dass Sie normalerweise auf etwas Bestimmtes warten sollten, anstatt auf eine willkürliche Verzögerung zu warten.

Die andere Sache, auf die Sie achten sollten, ruft Thread.Sleep von einem UI-Thread, der die UI nicht reagiert. Deaktivieren Sie besser die Teile der Benutzeroberfläche, mit denen der Benutzer nicht interagieren soll, und verwenden Sie dann ein Steuerelement Timer, um die Verzögerung zu implementieren.

+0

Dies ist ein perfekter Vorschlag! Es funktionierte so, wie ich es wollte in meinem Programm. Ich habe gerade einen weiteren Timer hinzugefügt, um eine bestimmte Zeit zu warten, bevor ich in einen anderen Teil des Programms gehe. – AndHeCodedIt

1

Während der Artikel selbst ist fraglich, ich mit seinem Start Satz zustimmen, die Ihr Anliegen

Thread.Sleep Adressen haben es Gebrauch ist : Simulation langwierige Operationen, während Testen/Debuggen auf einem MTA-Thread. In .NET gibt es keinen anderen Grund, es zu verwenden.

Ich glaube, dass das, was Sie fragen nach (Simulation von Pausen) und ist die wichtigste Verwendung von Thread.Sleep()

0

ich wäre bereit, dass in der Mehrzahl der Fälle zu wetten, wo ein Programmierer denkt an Mit Thread.Sleep() würde ein einfacher Code, der event s verwendet, sehr gut funktionieren.