Akzeptable Verwendung von Thread.Sleep ()

8

Ich arbeite an einer Konsolenanwendung, die geplant und in festgelegten Intervallen ausgeführt wird, etwa alle 30 Minuten. Sein einziger Zweck besteht darin, einen Web-Service abzufragen, um einen Batch von Datenbankzeilen zu aktualisieren.

Die Web-Service-API empfiehlt den Aufruf einmal alle 30 Sekunden und das Zeitlimit nach einem festgelegten Intervall. Der folgende Pseudocode wird als Beispiel angegeben:

%Vor%

Ich habe das grob in C # als:

codiert %Vor%

Ist es in dieser Situation OK, Thread.Sleep () zu verwenden? Ich bin mir bewusst, dass es im Allgemeinen keine gute Praxis ist, aber aus dem Lesen der Gründe, es nicht zu benutzen, scheint dies eine akzeptable Nutzung zu sein.

Danke.

    
TonE 10.01.2012, 15:36
quelle

7 Antworten

6

Thread.Sleep stellt sicher, dass der aktuelle Thread erst zurückgegeben wird, wenn mindestens die angegebenen Millisekunden überschritten haben. Es gibt viele Orte, an denen dies angebracht ist, und Ihr Beispiel scheint in Ordnung, vorausgesetzt, es läuft auf einem Hintergrundthread.

Einige Beispielorte, die Sie nicht verwenden möchten - im UI-Thread oder wo Sie genaues Timing benötigen.

    
Kieren Johnstone 10.01.2012, 15:39
quelle
5

Generell ist Thread.Sleep wie jedes andere Werkzeug: vollkommen in Ordnung, außer wenn es schrecklich missbraucht wird. Ich stimme nicht mit dem Teil "nicht allgemein gute Praxis" überein, der das Ergebnis von Menschen ist, die Thread.Sleep missbrauchen, wenn sie etwas anderes tun sollten (d. H. Blockierung eines Synchronisationsobjekts).

In Ihrem Fall ist das Programm single-threaded, es hat keine UI (d. h. der Thread hat keine Nachrichtenschleife) und Sie wollen nicht mit externen Ereignissen synchronisieren. Daher ist Thread.Sleep einfach in Ordnung.

    
Jon 10.01.2012 15:41
quelle
3

Der allgemeine Einwand gegen Sleep () ist, dass es einen Thread verschwendet.

In deinem Fall gibt es nur einen Thread (vielleicht zwei), also ist das nicht wirklich ein Problem.

Also ich denke, es sieht gut aus (aber ich würde 29 Sekunden schlafen, um etwas Durchhang zu schneiden).

    
Henk Holterman 10.01.2012 15:40
quelle
1

Es ist in Ordnung, außer dass Sie es nicht unterbrechen können, sobald es in den Schlaf geht, ohne den Thread abzubrechen (was nicht empfohlen wird).

Deshalb ist eine ManualResetEvent vielleicht eine bessere Idee, da sie von einem anderen Thread signalisiert ("wecken") werden kann.

    
Groo 10.01.2012 15:40
quelle
1

Sie könnten bei der Thread.Sleep-Methode bleiben. Aber es wäre eleganter, wenn man ihn alle 30 Minuten laufen lässt - so müssen Sie sich nicht um das Warten in Ihrer Anwendung kümmern.

    
Gambrinus 10.01.2012 15:41
quelle
0

Thread.Sleep ist nicht das beste zum Ausführen periodischer Logik. Thread.Sleep (n) bedeutet, dass der Thread die Steuerung für n Millisekunden aufgibt. Es gibt keine Garantie, dass es nach n Millisekunden die Kontrolle zurückgewinnt, es hängt von der CPU-Last ab.

    
Michael Hornfeck 10.01.2012 15:43
quelle
0

Wenn Sie den Thread für 30 Minuten sperren, sollten Sie alle 30 Minuten eine Windows-Task planen, damit das Programm ausgeführt und dann beendet wird. Auf diese Weise sperren Sie einen Thread nicht so lange.

Für kürzere Zeiten, wie 30 Sekunden / 1 Minute, ist System.Thread.Sleep () völlig in Ordnung. Für mehr als 5 Minuten würde ich eine Windows-Aufgabe verwenden. (Im Spanisch, ich denke, auf der englischen Version werden so genannt, ich spreche über die Aufgaben, die Sie von der Systemsteuerung planen ;-))

    
H27studio 10.01.2012 16:42
quelle

Tags und Links