0Pricing
C# Academy · Lektion

Worker-Service-Projekte

Erstellen Sie einen eigenständigen Worker Service, konfigurieren Sie DI und Logging und stellen Sie ihn als Windows-Dienst oder Linux-Daemon bereit.

Worker-Service-Projekte ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist ein Worker Service?

Ein Worker Service ist eine .NET-Projektvorlage zum Erstellen langfristig laufender Hintergrundanwendungen – ohne Webserver und ohne HTTP-Endpunkte. Es handelt sich um einen schlanken Host, der sich ideal für Warteschlangenverarbeiter, geplante Aufgaben und Dienste im Daemon-Stil eignet.

Einen Worker Service erstellen

Verwenden Sie die CLI-Vorlage, um ein Worker-Service-Projekt zu erstellen. Sie erzeugt eine minimale Program.cs-Datei und eine Worker.cs-Klasse, die von BackgroundService erbt.

# Create a new Worker Service project
dotnet new worker -n OrderProcessor

# Generated structure:
# OrderProcessor/
#   Program.cs       — host configuration
#   Worker.cs        — your BackgroundService subclass
#   appsettings.json

Program.cs des Worker Service

Die generierte Program.cs verwendet den Generic Host. Sie konfigurieren DI, Protokollierung und Konfiguration und registrieren Ihren Worker – genauso wie in ASP.NET Core, jedoch ohne Webserver.

using Microsoft.Extensions.Hosting;

var builder = Host.CreateApplicationBuilder(args);

// Register services
builder.Services.AddDbContext<AppDbContext>(opt =>
    opt.UseSqlServer(builder.Configuration.GetConnectionString("Default")));

builder.Services.AddScoped<IOrderRepository, OrderRepository>();
builder.Services.AddHostedService<OrderProcessorWorker>();

var host = builder.Build();
host.Run();

Die Worker-Klasse

Erben Sie von BackgroundService und implementieren Sie ExecuteAsync. Der Host ruft die Methode beim Start auf und übergibt ein CancellationToken, das beim Herunterfahren ausgelöst wird.

public class OrderProcessorWorker : BackgroundService
{
    private readonly IServiceScopeFactory _factory;
    private readonly ILogger<OrderProcessorWorker> _logger;

    public OrderProcessorWorker(
        IServiceScopeFactory factory,
        ILogger<OrderProcessorWorker> logger)
    {
        _factory = factory;
        _logger  = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken ct)
    {
        while (!ct.IsCancellationRequested)
        {
            using var scope = _factory.CreateScope();
            var repo = scope.ServiceProvider.GetRequiredService<IOrderRepository>();
            var pending = await repo.GetPendingAsync(ct);
            foreach (var order in pending)
                await ProcessOrderAsync(order, ct);
            await Task.Delay(TimeSpan.FromSeconds(10), ct);
        }
    }

    private Task ProcessOrderAsync(Order o, CancellationToken ct) =>
        Task.Delay(100, ct); // placeholder
}

Konfiguration und DI in Worker Services

Worker Services unterstützen das vollständige .NET-Konfigurationssystem – appsettings, Umgebungsvariablen und Benutzergeheimnisse. Injizieren Sie IConfiguration oder stark typisierte Optionen.

builder.Services.Configure<WorkerSettings>(
    builder.Configuration.GetSection("Worker"));

public class OrderProcessorWorker : BackgroundService
{
    private readonly WorkerSettings _settings;

    public OrderProcessorWorker(IOptions<WorkerSettings> opts, ...)
        => _settings = opts.Value;

    protected override async Task ExecuteAsync(CancellationToken ct)
    {
        while (!ct.IsCancellationRequested)
        {
            // ...
            await Task.Delay(_settings.PollIntervalSeconds * 1000, ct);
        }
    }
}

Protokollierung in Worker Services

Der Generic Host konfiguriert die Protokollierung automatisch. Verwenden Sie ILogger<T> für strukturierte Protokollierung. Konfigurieren Sie in der Produktion Serilog, Application Insights oder einen anderen Anbieter.

// Add Serilog to a Worker Service
builder.Host.UseSerilog((ctx, logConfig) =>
    logConfig
        .ReadFrom.Configuration(ctx.Configuration)
        .WriteTo.Console()
        .WriteTo.Seq(ctx.Configuration["Seq:ServerUrl"]!));

// Structured logging in the worker:
_logger.LogInformation("Processing {Count} orders at {Time}",
    orders.Count, DateTimeOffset.UtcNow);
_logger.LogError(ex, "Failed to process order {OrderId}", order.Id);

Als Windows-Dienst ausführen

Verwenden Sie UseWindowsService(), um Ihren Worker als Windows-Dienst auszuführen. Der Dienst wird zusammen mit dem Betriebssystem gestartet und beendet und läuft auch nach der Abmeldung von Benutzern weiter.

// dotnet add package Microsoft.Extensions.Hosting.WindowsServices

builder.Services.AddWindowsService(options =>
    options.ServiceName = "OrderProcessor");

// Build and publish:
// dotnet publish -c Release -o ./publish

// Install as Windows Service:
// sc create OrderProcessor binpath="C:\services\publish\OrderProcessor.exe"
// sc start OrderProcessor

Als Linux-Systemd-Daemon ausführen

Verwenden Sie UseSystemd(), um Ihren Dienst unter Linux in systemd zu integrieren. Der Dienst empfängt ordnungsgemäße Stoppsignale und wird in die Protokollierung über journald integriert.

// dotnet add package Microsoft.Extensions.Hosting.Systemd

builder.Services.AddSystemd();

// Systemd unit file: /etc/systemd/system/orderprocessor.service
// [Unit]
// Description=Order Processor Worker
// [Service]
// Type=notify
// ExecStart=/usr/bin/dotnet /app/OrderProcessor.dll
// Restart=always
// [Install]
// WantedBy=multi-user.target

// Commands:
// sudo systemctl enable orderprocessor
// sudo systemctl start orderprocessor
// sudo journalctl -u orderprocessor -f

In Docker ausführen

Worker Services eignen sich ideal für Docker-Container – es ist keine Portzuordnung erforderlich. Führen Sie einfach den Prozess in einer Schleife aus, bis der Container beendet wird.

# Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app

FROM mcr.microsoft.com/dotnet/runtime:9.0
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "OrderProcessor.dll"]

# docker-compose.yml:
# services:
#   worker:
#     build: .
#     environment:
#       - ConnectionStrings__Default=Server=db;...
#     depends_on: [db]

Praxisbeispiel: Worker für E-Mail-Zusammenfassungen

Ein vollständiger Worker, der tägliche E-Mail-Zusammenfassungen erstellt, indem er Daten aus einer Datenbank liest und über einen E-Mail-Dienst versendet.

public class EmailDigestWorker : BackgroundService
{
    private readonly IServiceScopeFactory _factory;
    private readonly ILogger<EmailDigestWorker> _log;

    protected override async Task ExecuteAsync(CancellationToken ct)
    {
        // Run daily at midnight UTC
        while (!ct.IsCancellationRequested)
        {
            var now = DateTime.UtcNow;
            var next = now.Date.AddDays(1); // next midnight
            await Task.Delay(next - now, ct);

            using var scope = _factory.CreateScope();
            var mailer = scope.ServiceProvider.GetRequiredService<IDigestMailer>();

            try   { await mailer.SendDailyDigestsAsync(ct); }
            catch (Exception ex) { _log.LogError(ex, "Digest failed"); }
        }
    }
}

Kurztest

Was ist der wichtigste Unterschied zwischen einem Worker-Service-Projekt und einem ASP.NET-Core-Web-API-Projekt?

Zusammenfassung: Worker-Service-Projekte

Wichtigste Erkenntnisse:

  • Worker Service = Generic Host + BackgroundService, kein Webserver
  • Vollständige Unterstützung für DI, Protokollierung und Konfiguration – nur kein HTTP
  • UseWindowsService() für die Bereitstellung als Windows-Dienst
  • UseSystemd() für einen Linux-Daemon mit journald-Integration
  • Bereitstellung in Docker-Containern für cloudnative Hintergrundverarbeitung
  • Verwenden Sie im Worker für Scoped-Abhängigkeiten immer IServiceScopeFactory

Häufig gestellte Fragen

Ist die Lektion „Worker-Service-Projekte“ kostenlos?

Ja — der vollständige Text von „Worker-Service-Projekte“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Worker-Service-Projekte“?

Erstellen Sie einen eigenständigen Worker Service, konfigurieren Sie DI und Logging und stellen Sie ihn als Windows-Dienst oder Linux-Daemon bereit. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C# Academy zu starten?

Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Worker-Service-Projekte“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?

Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. IHostedService und BackgroundService
  2. Worker-Service-Projekte
  3. Periodische Aufgaben und Timer
  4. Geplante Jobs mit Quartz.NET
← Zurück zu C# Academy