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.
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.
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.
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).
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.
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.
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 ;-))