Worker Service-projekt
Skapa en fristående Worker Service, konfigurera DI och loggning och distribuera den som en Windows-tjänst eller Linux-daemon.
Worker Service-projekt är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 4 lektioner.
Vad är en Worker Service?
En Worker Service är en .NET-projektmall för att bygga långvariga bakgrundsapplikationer — utan webbserver och HTTP-slutpunkter. Det är en lättviktig värd som passar utmärkt för köbearbetning, schemalagda uppgifter och daemon-liknande tjänster.
Skapa en Worker Service
Använd CLI-mallen för att skapa stommen till ett Worker Service-projekt. Den genererar en minimal Program.cs och en Worker.cs-klass som ärver från BackgroundService.
# Create a new Worker Service project
dotnet new worker -n OrderProcessor
# Generated structure:
# OrderProcessor/
# Program.cs — host configuration
# Worker.cs — your BackgroundService subclass
# appsettings.jsonWorker Service Program.cs
Den genererade Program.cs använder Generic Host. DI, loggning och konfiguration ställs in, och workern registreras — på samma sätt som i ASP.NET Core, men utan webbserver.
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();Worker-klassen
Ärv från BackgroundService och implementera ExecuteAsync. Värden anropar den vid start och skickar med en cancellation token som signaleras vid avstängning.
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 och DI i workers
Worker Services stöder hela .NET:s konfigurationssystem — appsettings, miljövariabler och user secrets. Injicera IConfiguration eller starkt typade options.
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);
}
}
}Loggning i Worker Services
Generic Host konfigurerar loggning automatiskt. Använd ILogger<T> för strukturerad loggning. I produktion kan Serilog, Application Insights eller en annan provider konfigureras.
// 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);Köra som en Windows Service
Använd UseWindowsService() för att köra workern som en Windows Service. Tjänsten startas och stoppas tillsammans med operativsystemet och fortsätter att köras efter att användare loggat ut.
// 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 OrderProcessorKöra som en Linux-daemon med systemd
Använd UseSystemd() för integration med systemd i Linux. Tjänsten tar emot korrekta stoppsignaler och integreras med journald-loggning.
// 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 -fKöra i Docker
Worker Services passar utmärkt i Docker-containrar — ingen portmappning behövs; kör bara processen i en loop tills containern stoppas.
# 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]I praktiken: worker för e-postsammanfattningar
En komplett worker som skickar dagliga e-postsammanfattningar genom att läsa från en databas och distribuera dem via en e-posttjänst.
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"); }
}
}
}Snabb kontroll
Vad är den huvudsakliga skillnaden mellan ett Worker Service-projekt och ett ASP.NET Core Web API-projekt?
Sammanfattning: Worker Service-projekt
Viktigaste punkterna:
- Worker Service = Generic Host + BackgroundService, utan webbserver
- Fullt stöd för DI, loggning och konfiguration — men inget HTTP
UseWindowsService()för distribution som Windows ServiceUseSystemd()för Linux-daemon med journald-integration- Distribuera i Docker-containrar för molnbaserad bakgrundsbehandling
- Använd alltid IServiceScopeFactory för scoped-beroenden i workern
Lär dig C# med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 93
- Lektioner
- 346
Vanliga frågor
Är lektionen ”Worker Service-projekt” gratis?
Ja – hela texten till ”Worker Service-projekt” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Worker Service-projekt”?
Skapa en fristående Worker Service, konfigurera DI och loggning och distribuera den som en Windows-tjänst eller Linux-daemon. Ni övar på C# Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig C# Academy?
Du behöver inga förkunskaper. Utbildningen i C# Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”Worker Service-projekt”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här C# Academy-lektionen?
Ja. Varje C# Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- IHostedService och BackgroundService
- Worker Service-projekt
- Periodiska jobb och timers
- Schemalagda jobb med Quartz.NET