Frage

Diese Frage über Timer für Windows-Dienste hat mir denken :

Sagen, ich habe (und ich) ein Windows-Dienst, das ist auf einem Waithandle und wenn geweckt, es taucht in einen Warte-Spin, wie ich in einem Flussdiagramm unten gezeigt habe

Spin Diagramm warten http://www.86th.org/waitspin.jpg

Ich bin gespannt, ob mit Hilfe einer Zeitschaltuhr besser wäre als eine warten-Spin-Schleife (manchmal auch als Spin-wait). Ich werde ehrlich sein, habe ich noch nie Timer für alles verwendet anders als meine eigene Bastelei.

Ich habe keine Pläne zu wechseln, es sei denn die Unterschiede tiefgründig sind und die Vorteile einer Timer verwenden sind erstaunlich. Aber ich bin sehr interessiert an Menschen Gedanken über eine gegen die andere für die zukünftige Entwicklung dieses Projekts.

Lassen Sie mich wissen, ob dies ein Wiki sein sollte

War es hilfreich?

Lösung

Ich sehe nicht, dass Sie keinen Nutzen immer aus einem Timer. Sie sind im Wesentlichen als Timer ohnehin mit Ihrem Schlaf Anruf verhalten, und Sie werden eine Bandbreite Schwein nicht zu sein, da schläft die Zeitscheibe ergibt nach oben. eine explizite Timer Schleppe mit und rufen Sie ist einfach, den Code komplizieren würde.

Ich würde nicht wirklich sagen, dass Sie ein Spin-warten tun, da ich von einem Spin-warten im Allgemeinen denke, als etwas, das nicht schläft. Es brennt nur alles Prozessor Zeit für das Go-Signal warten.

Andere Tipps

Schlafen einen Thread und warte auf einem Griff mit einem Timeout ist im Grunde die gleiche Sache unter der Decke. Ich würde vermuten, dass Timer wird im Wesentlichen Schlaf implementiert, so dass nicht viel Unterschied, auch nicht. Mit anderen Worten, Sie könnten Ihren Code durch das Warten auf den Griff mit einem Timeout in einer einzigen Schleife vereinfachen und zu überprüfen, warum das Warten veröffentlicht wurde (Daten verfügbar oder Timeout), anstatt die Umsetzung getrennte Warte und Schlaf-Loops. Etwas effizienter als unabhängige Schleifen.

Im Idealfall würden Sie nicht schlafen überhaupt verwenden und hängen einfach auf dem Daten-Generation-Code korrekt den Fall, dass Ihr Verbrauch Code zu erhöhen wartet auf mit einer längeren Auszeit zu behandeln, wenn die Ereignisquelle verschwunden ist.

Wenn die Daten extern, wie auf einem Sockel oder eine anderen Eingabegerät, dann kann der Griff der Regel eingestellt werden warten, um zu ermöglichen, für Daten zur Verfügung zu werden - keine Notwendigkeit, in diesem Fall abzufragen, da das Ereignis immer signalisiert wird, wenn Daten zum Verzehr bereit.

Wir Threads verwenden. Nicht nur, dass sie wie ein Timer durchzuführen, aber sie geben uns einen Griff andere Operationen auszuführen, während der Faden schläft.

Ich denke, es ist wirklich auf Ihrer Anforderung ab:

  1. Führen Sie die Task alle 5 min (zB 12:00, 12.05, 12.10, ...)
  2. Nach der aktuellen Aufgabe abgeschlossen, führen Sie die nächste Aufgabe nach 5 min.

Timer scheint für den Fall, einfach zu sein 1 und Thread.Sleep scheint für den Fall 2 leicht zu sein, auch wenn Timer und Thread.Sleep können beide tun.

ich in der Tat, setzen Sie einen längeren Kommentar (einschließlich einiger Überlegung auf den Fall 1) für eine ähnliche Frage ( Windows-Dienst geplant Ausführung ).

Polling ist schlecht, und fast immer vermeidbar. Gelegentlich für triviale Dinge ist es weniger schlimm als die Komplexität zu vermeiden erforderlich.

Welche Quelle sind Sie Abfrage für „Daten?“ dass Sie in eine Art Griff Warte nicht drehen können?

Auch, Sleep() nicht in ernsthaftem Code (wie ein Service) für jede Menge Zeit. Die einzige blockieren Sie tun können, ist WaitFor[Single|Multiple]Objects(...) wo die Liste der Griffe ein Ereignis umfasst, das ausgelöst wird, wenn es Zeit ist, den Prozess zu beenden. Finden Sie überall Sie anrufen Sleep(millisec) und ersetzen sie durch WaitForSingleObjects(g_shutdownEvent, millisec).

Wie Raymond Chen erklärt, "Ja, was auch immer." Wenn Sie nicht einen Weg finden, um zu bekommen benachrichtigt , wenn Ihre Daten bereit -. dann SOL

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top