2009-01-26 6 views
6

Ich habe eine C# -Anwendung, die einige Wartungsaufgaben ausführt. Es muss ungefähr jede Stunde laufen, obwohl es nicht so wichtig ist, wenn es ein bisschen aus ist. Und es muss auf einem Win2003 Server mit niemandem angemeldet sein.Windows-Dienst oder Taskplaner für Wartungsaufgaben?

Grundsätzlich frage ich mich, ob ich einen Windows-Dienst schreiben sollte, und wenn ja, wenn Thread.Sleep() eine ordnungsgemäße Möglichkeit ist, den Thread für eine anzuhalten Stunde, oder wenn es bessere Möglichkeiten gibt, um sicherzustellen, dass der Thread im Leerlauf bleibt und keine Serverbelastung bringt? (aka. Was ist das Gegenteil von einem Spinlock)

Die Alternative ist der Windows Taskplaner, aber ich bin mir nicht sicher, ob das für den Server gut ist, da a) ich würde den Zeitplan lieber darin speichern als in meiner app.config, b) Ich kann den Dienst nicht einfach durch Start/Stopp/Neustart und c) Ich weiß nicht, ob die Anmeldeinformationen des Windows-Benutzers so sicher sind, als wenn ich es in der Service MMC Snapin eingeben.

Was sind Ihre Meinungen? Ist es möglich und gut, einen untätigen Service zu haben, oder würden Sie stattdessen den Task Scheduler empfehlen?

Antwort

7

Sie können diese video interessant finden. Gutes Interview mit dem verantwortlichen Ingenieur für Windows-Dienste und geht auch wann Service oder Aufgabe auswählen. Kurz gesagt, wenn Ihre Funktion in die Kategorie der regelmäßigen Wartung fällt, gehen Sie mit einer Aufgabe.

0

Windows-Dienst ist sicherer: niemand kann es fallen lassen und funktioniert überhaupt. Ich habe viele Probleme mit Windows Tasks (nicht ausgeführt, ...) gefunden.

Der Windows Taskplaner ist für Endbenutzeraufgaben und nicht für Anwendungsaufgaben vorgesehen. Wie auch immer, Windows Backup verwendet es ;-)

5

Ich bevorzuge die Taskplaner selbst, wie es einfacher zu pflegen und Änderungen an den Zeitplan, wenn Sie müssen.

Auch Dienstprogramme, die kontinuierlich ausgeführt werden und "schlafen", laufen Gefahr, Probleme zu verursachen, wenn der Entwickler Dinge wie enge Verbindungen, Dateien usw. vergisst, die sich im Laufe der Zeit aufbauen können. Das Programm "laufen und verlassen" ist eine zusätzliche Schutzdecke. :-)

1

Wenn Sie die Service-Route gehen, dann würde ich System.Threading.Timer empfehlen. Damit können Sie festlegen, dass ein Ereignis einmal pro Stunde ausgelöst wird. Sie können das Intervall in die app.config legen, wenn Sie der Meinung sind, dass Sie es jemals ändern müssen.

Dienste werden auch unter dem lokalen Systemkonto ausgeführt (standardmäßig), während Sie bei der Verwendung von geplanten Aufgaben einen Benutzernamen/ein Kennwort angeben müssen. Wenn Sie Ihren Benutzernamen verwenden, wird dies zu einem Wartungsproblem, wenn Sie Ihr Kennwort ändern und vergessen, die Aufgabe zu aktualisieren.

Ich habe eine Situation, in der ich eine Kombination von beiden tatsächlich verwende. Der Dienst läuft ständig während des Tages, aber sie tun jede Nacht Netzwerk- und Datenbankwartung. Also verwende ich zwei geplante Aufgaben. Einer, der den Dienst um Mitternacht schließt und einen um vier Uhr morgens wieder einzuschalten. Dies geschieht durch Aufrufen von .BAT-Dateien mit NET STOP/NET START-Befehlen.

1

Ich denke, ein Windows-Dienst ist wahrscheinlich zuverlässiger und einfacher zu überwachen, aber es bietet nicht die gleiche Flexibilität bei der Planung wie eine geplante Aufgabe out-of-the-box. Ich würde wahrscheinlich trotzdem mit dem Dienst gehen, da die meisten Unternehmens-Apps dazu neigen, als Dienste, nicht als geplante Aufgaben ausgeführt zu werden.

Für aktuelle Projekte habe ich Quartz.NET verwendet, um geplante Verarbeitung in Windows-Diensten einzurichten. Es ist eigentlich nicht zu schwer einzurichten (gutes Tutorial), und der CronTrigger wird Ihnen eine Menge Flexibilität mit nur ein bisschen Konfiguration geben. Ich mag es besser als ein roher .NET Timer.

1

Ich denke, um meine 5 Cent wert zu werfen, mit Taskplaner wird Speicherplatz sparen, wenn Ihre Aufgabe nicht ausgeführt wird.

Verwandte Themen