Aufgabenplaner in C# (.NET): Quartz.NET und System.Threading.Timer

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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 Quartz


Beispiel: 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

Empfehlungen