Aufgabenwarteschlangen für C# (.NET): Vom Einfachen zum Komplexen
Moderne Entwicklung mit C# (.NET) kommt selten ohne Hintergrundaufgaben, verzögerte Verarbeitung und asynchrone Operationen aus. Aufgabenwarteschlangen (Job Queues / Message Queues) sind ein Schlüsselmuster, das den Hauptthread der Anwendung entlastet, die Zustellung von Nachrichten garantiert und die Verarbeitung skalierbar macht. In diesem Artikel betrachten wir drei beliebte Ansätze zur Implementierung von Warteschlangen in .NET: die integrierte System.Threading.Channels, den leistungsstarken Planer Hangfire und den industriellen Nachrichtenbroker RabbitMQ mit einem Client für .NET.
1. System.Threading.Channels — Integrierte Warteschlange in .NET
System.Threading.Channels ist eine leichtgewichtige, threadsichere Warteschlange, die direkt in .NET verfügbar ist (ab .NET Core 2.1). Sie ist ideal für „Producer-Consumer“-Szenarien innerhalb eines einzelnen Prozesses.
Hauptfunktionen:
- Asynchrones Lesen und Schreiben (
await writer.WriteAsync(),await reader.ReadAsync()). - Begrenzte und unbegrenzte Kanäle (Bounded / Unbounded).
- Unterstützung für Abbruch durch
CancellationToken. - Batch-Lesen (
ReadAllAsync).
Beispiel: Einfache Aufgabenwarteschlange
using System.Threading.Channels;
// Erstellen eines Kanals mit einem Puffer von 100 Elementenvar channel = Channel.CreateBounded<string>(100);
// Producer: Aufgaben hinzufügenvar producer = Task.Run(async () =>{ for (int i = 0; i < 10; i++) { await channel.Writer.WriteAsync($"Aufgabe {i}"); await Task.Delay(100); } channel.Writer.Complete(); // Signal zum Abschluss});
// Consumer: Aufgaben verarbeitenvar consumer = Task.Run(async () =>{ await foreach (var item in channel.Reader.ReadAllAsync()) { Console.WriteLine($"Verarbeitet: {item}"); }});
await Task.WhenAll(producer, consumer);Vorteile: Keine Abhängigkeiten, hohe Leistung, ideal für In-Memory-Warteschlangen in einer einzelnen Anwendung.
Nachteile: Nicht geeignet für verteilte Systeme – Daten gehen bei Neustart verloren.
2. Hangfire — Erweiterter Planer für Hintergrundaufgaben
Hangfire ist eine beliebte Bibliothek für .NET, die nicht nur eine Warteschlange implementiert, sondern auch ein Web-Dashboard, Persistenz (SQL Server, Redis, PostgreSQL), Wiederholungsversuche und CRON-Zeitpläne bietet.
Schlüsselfunktionen:
- Fire-and-Forget (einmaliger Start).
- Verzögerte Aufgaben (Delayed).
- Wiederkehrende Aufgaben (Recurring) – Ersatz für den Windows Task Scheduler.
- Automatische Wiederholungen mit konfigurierbarer Richtlinie.
- Integrierte Überwachung (Dashboard).
Beispiel: Grundlegende Hangfire-Konfiguration
// Installation: Install-Package Hangfireusing Hangfire;using Hangfire.SqlServer;
// Konfiguration in Program.cs (.NET 6+)var builder = WebApplication.CreateBuilder(args);builder.Services.AddHangfire(config => config.UseSqlServerStorage(builder.Configuration.GetConnectionString("HangfireDb")));builder.Services.AddHangfireServer();
var app = builder.Build();app.UseHangfireDashboard(); // /hangfire
// Aufgaben hinzufügenBackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-Forget!"));BackgroundJob.Schedule(() => Console.WriteLine("In 5 Minuten"), TimeSpan.FromMinutes(5));RecurringJob.AddOrUpdate("my-job", () => Console.WriteLine("Jede Minute"), Cron.Minutely);
app.Run();Vorteile: Umfangreiche Funktionalität, Zustandserhaltung zwischen Neustarts, fertige Benutzeroberfläche.
Nachteile: Erfordert eine Datenbank, nicht geeignet für hochbelastete verteilte Systeme (auf Monolithen ausgelegt).
3. RabbitMQ + .NET — Verteilte Nachrichtenwarteschlange
RabbitMQ
Auch in der Bibliothek
Mocha JavaScript (Node.js): Komplettleitfaden mit Beispielen
Fastify für JavaScript (Node.js): Komplettes Tutorial mit Beispielen
Arbeiten mit Daten in JavaScript (Node.js): Beliebte Bibliotheken
Autorisierung und Authentifizierung in Rust: Bibliotheken und Werkzeuge
gRPC für Go (Golang): Bibliotheken, Beispiele und Anleitung
Empfehlungen