Frage

Das Applet muss beispielsweise alle 1–4 Stunden die Existenz eines Verzeichnisses abfragen und ein paar E-Mails/NET SENDs senden, wenn es nicht gefunden wird.Das genaue Intervall kann ich noch nicht sagen, aber es wird definitiv nicht kürzer als eine Stunde sein.Der gesamte „Job“ wird auf absehbare Zeit dauerhaft und ununterbrochen ausgeführt sein.Das Applet wird auf einem Win2k3-Server laufen, und basierend auf den (extrem leichten) Benutzernutzungsmustern bezweifle ich, dass es die primären Serverfunktionen in nennenswerter Weise beeinträchtigt, aber ich möchte natürlich nur, dass es sich gut verhält!Es wird überlegt, es irgendwann als Win-Dienst zu implementieren, aber aus verschiedenen Gründen wird die erste Implementierung als Konsolen-App erfolgen.

Suche nach der Implementierung, die im Hinblick auf die Systemressourcennutzung, insbesondere CPU und RAM, am schlanksten ist. Am meisten besorgt über die Timing-/Polling-Implementierung vs.CPU auslastung. Es wird nicht viele Objekte, GUI usw. geben.erstellt, daher sollte die RAM-Nutzung kein großes Problem darstellen, aber muss ich der Garbage Collection besondere Aufmerksamkeit schenken, wenn ich sie als lang laufende EXE-Datei (im Sinne von Monaten/Jahren) umsetze?

FileSystemWatcher?
System.Timers.Timer?
Thread.Sleep?
andere?

Während ich dies schreibe, stellt sich tatsächlich heraus, dass die einfachste Implementierung – vom Standpunkt der Wiederverwendung der vielen vorhandenen „Räder“, die bereits für diese Art von Aufgabe erfunden wurden – darin bestehen wird, überhaupt keine Abfrage durchzuführen, sondern sie einfach so zu entwerfen, dass sie startet, Führen Sie Aktionen aus, schließen Sie sie und lassen Sie die Windows-Infrastruktur für geplante Aufgaben den Timing-Aspekt übernehmen.Aber ich habe trotzdem gepostet, um eine Bestätigung dieser Idee und allgemeine Informationen zum späteren Nachschlagen zu erhalten.TY!

War es hilfreich?

Lösung

Windows Scheduled Task ist definitiv der richtige Weg.Und Thread.Sleep(n) ist es definitiv nicht der Weg, den man gehen sollte.A System.Timers.Timer wäre der richtige Weg, wenn Sie dies aus Ihrer Anwendung heraus tun würden, mit einem Anfangsintervall von 3600000.Bei jedem abgelaufenen Ereignis sollten Sie den Timer deaktivieren, den erforderlichen Code ausführen und dann den Timer mit einem Intervall wieder aktivieren, das der nächsten vollen Stunde minus der aktuellen Systemzeit entspricht.Andernfalls wird Ihr Timer nicht mehr mit der Systemzeit synchron sein (obwohl dies für Ihre Zwecke möglicherweise keine Rolle spielt, also zum Teufel damit).

Andere Tipps

Verwenden Sie die Windows-Planungsdienste, um die Ausführung Ihrer Konsolen-App zu planen.Führen Sie mit Directory.Exists eine einfache Überprüfung des Verzeichnisses durch und senden Sie bei Bedarf E-Mails.

Ich würde es so entwerfen, dass es als Headless-Anwendung ausgeführt wird (Protokollierung im Ereignisprotokoll oder in der Senke Ihrer Wahl) und den Taskplaner seine Arbeit erledigen lassen und ihn stündlich aufrufen.

Es besteht kein Grund, die Dinge zu kompliziert zu machen.

In der Vergangenheit habe ich solche Aufgaben erledigt, indem ich einfach eine Konsolenanwendung erstellt und sie über eine geplante Windows-Aufgabe ausgeführt habe.Auf diese Weise kann es seine Aktion ausführen und dann aus dem Speicher entladen.Außerdem ist es einfach, die geplante Aufgabe vorübergehend zu deaktivieren, wenn Arbeiten am Server erledigt werden müssen (z. B. Systemaktualisierungen).Wenn sich außerdem der Zeitplan ändern muss (mehr/seltener), berücksichtigt die Schnittstelle für geplante Aufgaben bereits mehrere Ausführungen.

Wir haben aus mehreren Gründen versucht, ähnliche Tools wie die Windows-Dienste zu schreiben (wie Sie sagten, eine zukünftige Implementierung könnte dies sein):

  • Einfache Fernverwaltung über NET.EXE (und eventuell PowerShell)
  • Einfache Überwachung über System Center Operations Manager (ehemals MOM)
  • Kann bei Bedarf Daten/Objekte zwischenspeichern
  • Standardisierung

Beachten Sie, dass wir ein Framework und eine zugehörige Vorlage zum Erstellen dieser Projekte entwickelt haben.Auf diese Weise muss sich nicht jedes Projekt um die Konfiguration des Abfrageintervalls usw. kümmern.

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