Ich habe einen Dienst in C # (.NET 1.1) geschrieben und möchte, dass er jeden Abend um Mitternacht einige Bereinigungsaktionen ausführt. Ich muss den gesamten im Service enthaltenen Code behalten. Was ist der einfachste Weg, dies zu erreichen? Verwendung Thread.Sleep()
und Überprüfung der Zeitüberschreitung?
c#
windows-services
scheduling
scheduled-tasks
ctrlalt3nd
quelle
quelle
Antworten:
Ich würde Thread.Sleep () nicht verwenden. Verwenden Sie entweder eine geplante Aufgabe (wie bereits erwähnt) oder richten Sie in Ihrem Dienst einen Timer ein, der regelmäßig ausgelöst wird (z. B. alle 10 Minuten), und prüfen Sie, ob sich das Datum seit dem letzten Lauf geändert hat:
quelle
Schauen Sie sich Quartz.NET an . Sie können es in einem Windows-Dienst verwenden. Es ermöglicht Ihnen, einen Job basierend auf einem konfigurierten Zeitplan auszuführen, und es unterstützt sogar eine einfache "Cron-Job" -Syntax. Ich habe viel Erfolg damit gehabt.
Hier ist ein kurzes Beispiel für seine Verwendung:
quelle
Eine tägliche Aufgabe? Klingt so, als ob es sich nur um eine geplante Aufgabe (Systemsteuerung) handeln sollte - hier ist kein Service erforderlich.
quelle
Muss es ein tatsächlicher Service sein? Können Sie einfach die eingebauten geplanten Aufgaben in der Windows-Systemsteuerung verwenden?
quelle
Ich erreiche dies mit einem Timer.
Führen Sie einen Server-Timer aus und überprüfen Sie alle 60 Sekunden die Stunde / Minute.
Wenn es die richtige Stunde / Minute ist, führen Sie Ihren Prozess aus.
Ich habe dies tatsächlich in eine Basisklasse abstrahiert, die ich OnceADayRunner nenne.
Lassen Sie mich den Code ein wenig aufräumen und ich werde ihn hier posten.
Das Rindfleisch der Methode befindet sich in der e.SignalTime.Minute / Hour-Prüfung.
Es gibt Haken zum Testen usw., aber so könnte Ihr verstrichener Timer aussehen, damit alles funktioniert.
quelle
Wie andere bereits geschrieben haben, ist ein Timer die beste Option in dem von Ihnen beschriebenen Szenario.
Abhängig von Ihren genauen Anforderungen ist es möglicherweise nicht erforderlich, die aktuelle Zeit jede Minute zu überprüfen. Wenn Sie die Aktion nicht genau um Mitternacht, sondern nur innerhalb einer Stunde nach Mitternacht ausführen müssen , können Sie nach Martins Ansatz nur prüfen, ob sich das Datum geändert hat.
Wenn der Grund, warum Sie Ihre Aktion um Mitternacht ausführen möchten, darin besteht, dass Sie eine geringe Arbeitslast auf Ihrem Computer erwarten, sollten Sie besser darauf achten: Dieselbe Annahme wird häufig von anderen getroffen, und plötzlich werden zwischen 0:00 und 0 100 Bereinigungsaktionen gestartet : 01 Uhr
In diesem Fall sollten Sie in Betracht ziehen, die Bereinigung zu einem anderen Zeitpunkt zu starten. Normalerweise mache ich diese Dinge nicht zur vollen Stunde, sondern zur halben Stunde (1.30 Uhr ist meine persönliche Präferenz)
quelle
Ich würde vorschlagen, dass Sie einen Timer verwenden, diesen jedoch so einstellen, dass er alle 45 Sekunden und nicht jede Minute überprüft wird. Andernfalls kann es zu Situationen kommen, in denen bei starker Belastung die Prüfung für eine bestimmte Minute verpasst wird, da Sie zwischen dem Auslösen des Timers und der Ausführung Ihres Codes und dem Überprüfen der aktuellen Zeit möglicherweise die Zielminute verpasst haben.
quelle
Sie können die TaskSchedulerLibrary auch hier http://visualstudiogallery.msdn.microsoft.com/a4a4f042-ffd3-42f2-a689-290ec13011f8 ausprobieren
Implementieren Sie die abstrakte Klasse
AbstractScheduledTask
und rufen Sie dieScheduleUtilityFactory.AddScheduleTaskToBatch
statische Methode aufquelle
Für diejenigen, die festgestellt haben, dass die oben genannten Lösungen nicht funktionieren, liegt dies daran, dass Sie möglicherweise eine
this
in Ihrer Klasse haben, was eine Erweiterungsmethode impliziert, die, wie in der Fehlermeldung angegeben, nur für eine nicht generische statische Klasse sinnvoll ist. Ihre Klasse ist nicht statisch. Dies scheint als Erweiterungsmethode nicht sinnvoll zu sein, da es auf die betreffende Instanz wirkt. Entfernen Sie daher diethis
.quelle
Versuche dies:
quelle