Worker Service Projeleri
Bağımsız bir Worker Service oluşturun, DI ve günlük kaydını yapılandırın, Windows Service veya Linux daemon olarak dağıtın.
Worker Service Projeleri, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
Çalışan Hizmeti Nedir?
Çalışan hizmeti, uzun süre çalışan arka plan uygulamaları oluşturmak için kullanılan bir .NET proje şablonudur; web sunucusu veya HTTP uç noktaları içermez. Kuyruk işlemcileri, zamanlanmış görevler ve arka plan programı tarzındaki hizmetler için ideal, hafif bir ana bilgisayardır.
Çalışan Hizmeti Oluşturma
Çalışan hizmeti projesi oluşturmak için CLI şablonunu kullanın. Bu şablon, minimal bir Program.cs dosyası ve BackgroundService sınıfından miras alan bir Worker.cs sınıfı oluşturur.
# 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Çalışan Hizmeti Program.cs
Oluşturulan Program.cs, Genel Ana Bilgisayar'ı kullanır. DI, günlük kaydı ve yapılandırmayı yapılandırır, ardından çalışanınızı kaydedersiniz; web sunucusu olmaması dışında ASP.NET Core ile aynıdır.
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();Çalışan Sınıfı
BackgroundService sınıfından miras alın ve ExecuteAsync yöntemini uygulayın. Ana bilgisayar bu yöntemi başlangıçta çağırır ve kapanma sırasında tetiklenen bir iptal belirteci iletir.
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
}Çalışanlarda Yapılandırma ve DI
Çalışan hizmetleri .NET'in tam yapılandırma sistemini destekler: uygulama ayarları, ortam değişkenleri ve kullanıcı gizli dizileri. IConfiguration veya güçlü türlendirilmiş seçenekleri ekleyin.
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);
}
}
}Çalışan Hizmetlerinde Günlük Kaydı
Genel Ana Bilgisayar günlük kaydını otomatik olarak yapılandırır. Yapılandırılmış günlük kaydı için ILogger<T> kullanın. Üretimde Serilog, Application Insights veya başka bir sağlayıcıyı yapılandırın.
// 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);Windows Hizmeti Olarak Çalıştırma
Çalışanınızı Windows hizmeti olarak çalıştırmak için UseWindowsService() kullanın. Hizmet işletim sistemiyle birlikte başlar ve durur, ayrıca kullanıcıların oturum kapatmasından etkilenmez.
// 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 OrderProcessorLinux Systemd Arka Plan Programı Olarak Çalıştırma
Linux'ta systemd ile tümleştirmek için UseSystemd() kullanın. Hizmet uygun durdurma sinyallerini alır ve journald günlük kaydıyla tümleşir.
// 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 -fDocker'da Çalıştırma
Çalışan hizmetleri Docker kapsayıcıları için idealdir; bağlantı noktası eşlemesi gerekmez, yalnızca kapsayıcı durana kadar işlemi bir döngü içinde çalıştırmanız yeterlidir.
# 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]Gerçek Dünya: E-posta Özeti Çalışanı
Veritabanından okuyarak günlük e-posta özetleri gönderen ve bunları bir e-posta hizmeti aracılığıyla dağıtan eksiksiz bir çalışan.
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"); }
}
}
}Kısa Kontrol
Çalışan hizmeti projesi ile ASP.NET Core Web API projesi arasındaki temel fark nedir?
Özet: Çalışan Hizmeti Projeleri
Temel çıkarımlar:
- Çalışan hizmeti = Genel Ana Bilgisayar + BackgroundService, web sunucusu yoktur
- Tam DI, günlük kaydı ve yapılandırma desteği vardır; yalnızca HTTP yoktur
- Windows hizmeti dağıtımı için
UseWindowsService() - journald tümleştirmeli Linux arka plan programı için
UseSystemd() - Bulut yerel arka plan işleme için Docker kapsayıcılarına dağıtın
- Çalışandaki kapsamlı bağımlılıklar için her zaman IServiceScopeFactory kullanın
Sıkça Sorulan Sorular
“Worker Service Projeleri” dersi ücretsiz mi?
Evet — “Worker Service Projeleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“Worker Service Projeleri” dersinde ne öğreneceğim?
Bağımsız bir Worker Service oluşturun, DI ve günlük kaydını yapılandırın, Windows Service veya Linux daemon olarak dağıtın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Worker Service Projeleri” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- IHostedService ve BackgroundService
- Worker Service Projeleri
- Düzenli Görevler ve Zamanlayıcılar
- Quartz.NET Zamanlanmış İşleri