Aufgabenplaner in C# (.NET): Vom einfachen Timer bis zum industriellen Quartz.NET
Ein Aufgabenplaner (Task Scheduler) ist ein wesentlicher Bestandteil jeder ernsthaften Anwendung. Ob es sich um die regelmäßige Cache-Bereinigung, den Versand von E-Mail-Newslettern oder die Synchronisation von Daten mit einer externen API handelt – ein zuverlässiger Mechanismus zur Ausführung von Hintergrundoperationen ist unerlässlich. Im .NET-Ökosystem stehen dem Entwickler mehrere Ansätze zur Verfügung: vom integrierten System.Threading.Timer bis zum leistungsstarken und flexiblen Framework Quartz.NET. In diesem Artikel werden wir beide Optionen analysieren, Codebeispiele zeigen und Ihnen helfen, das passende Werkzeug für Ihr Projekt auszuwählen.
1. Integrierter System.Threading.Timer
Der einfachste und leichteste Weg, eine Aufgabe nach einem Zeitplan auszuführen, ist die Verwendung von System.Threading.Timer. Er erfordert keine Installation von Drittanbieter-Paketen und ist ideal für einfache Szenarien: Ausführung einer Methode in festen Intervallen oder eine einmalige Verzögerung.
Beispiel: Aufgabe alle 5 Sekunden ausführen
using System;using System.Threading;
class Program{ static void Main() { // Timer erstellen, der den Callback alle 5 Sekunden auslöst Timer timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5)); Console.WriteLine("Timer gestartet. Drücken Sie die Eingabetaste zum Beenden."); Console.ReadLine(); timer.Dispose(); }
static void DoWork(object state) { Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] Ausführung der Hintergrundaufgabe..."); }}Vorteile:
- In .NET integriert, keine zusätzlichen Bibliotheken erforderlich.
- Minimaler Ressourcenverbrauch.
- Einfach zu bedienen.
Nachteile:
- Keine integrierte Unterstützung für CRON-Ausdrücke.
- Schwierig, mehrere Aufgaben mit unterschiedlichen Zeitplänen zu verwalten.
- Keine Persistenzmechanismen (Aufgaben gehen bei Neustart verloren).
- Der Callback wird in einem Thread aus dem Pool ausgeführt, mögliche Synchronisationsprobleme.
Für Lernprojekte und einfache Dienstprogramme ist System.Threading.Timer eine ausgezeichnete Wahl. Für Produktionsanwendungen mit Dutzenden von Aufgaben sollten Sie jedoch fortschrittlichere Lösungen in Betracht ziehen.
2. Quartz.NET – Industrieller Aufgabenplaner
Quartz.NET ist ein leistungsstarkes, flexibles und ausgereiftes Framework für die Aufgabenplanung in .NET. Es ist vom beliebten Java-Pendant Quartz inspiriert und unterstützt:
- CRON-Ausdrücke für flexible Zeitpläne (jede zweite Stunde, an Wochentagen um 9:00 Uhr usw.).
- Persistenz von Aufgaben (Speicherung in der Datenbank).
- Clustering (mehrere Server können Aufgaben ausführen).
- Behandlung verpasster Aufgaben (Misfire Handling).
- Unteraufgaben und Trigger.
Installation von Quartz.NET
Installieren Sie das Paket über NuGet:
dotnet add package QuartzBeispiel: Einfache Aufgabe mit CRON-Zeitplan
using System;using System.Threading.Tasks;using Quartz;using Quartz.Impl;
class Program{ static async Task Main() { // Planer erstellen StdSchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = await factory.GetScheduler(); await scheduler.Start();
// Aufgabe (Job) definieren IJobDetail job = JobBuilder.Create<HelloJob>() .WithIdentity("helloJob", "group1") .Build();
// Trigger erstellen: jeden Tag um 10:30 Uhr ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithCronSchedule("0 30 10 ? * * *") // CRON: Sekunde, Minute, Stunde, Tag, Monat, Wochentag .Build();
// Aufgabe mit Trigger registrieren await scheduler.ScheduleJob(job, trigger);
Console Auch in der Bibliothek
JUnit 5 für Java: Vollständiger Leitfaden mit Beispielen
Geolokalisierung und Karten in Go: Überblick über Bibliotheken und Codebeispiele
Arbeiten mit Bildern in PHP: Resize, Crop und Optimierung mit GD und Imagick
SwiftyJSON für Swift: Vollständiges Handbuch mit Beispielen
Dokka für Kotlin: Das komplette Tutorial mit Praxisbeispielen