IHostedService ve BackgroundService
Bir .NET konağında arka planda iş çalıştırmak için IHostedService'i ve soyut BackgroundService'i uygulayın.
IHostedService ve BackgroundService, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 1. 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.
Arka Plan Hizmetleri Nedir?
Arka plan hizmetleri, ASP.NET Core uygulamanızla birlikte uzun süre çalışan işleri yürütür: kuyrukları işler, zamanlanmış görevleri çalıştırır veya kaynakları izler. .NET iki arabirim sağlar: IHostedService (minimal) ve soyut BackgroundService (döngüler için uygundur).
IHostedService Arabirimi
IHostedService iki yönteme sahiptir: StartAsync (ana bilgisayar başladığında çağrılır) ve StopAsync (düzgün kapanma sırasında çağrılır). Tek seferlik başlatma ve kapatma görevleri için idealdir.
public class DatabaseMigratorService : IHostedService
{
private readonly IServiceScopeFactory _scopeFactory;
public DatabaseMigratorService(IServiceScopeFactory sf) => _scopeFactory = sf;
public async Task StartAsync(CancellationToken ct)
{
using var scope = _scopeFactory.CreateScope();
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
await db.Database.MigrateAsync(ct);
}
public Task StopAsync(CancellationToken ct) => Task.CompletedTask;
}
builder.Services.AddHostedService<DatabaseMigratorService>();BackgroundService: Uzun Süren Döngüler
BackgroundService, IHostedService uygulayan soyut bir sınıftır ve uygulamanın ömrü boyunca çalışan ExecuteAsync(CancellationToken) yöntemini sağlar.
public class HeartbeatService : BackgroundService
{
private readonly ILogger<HeartbeatService> _logger;
public HeartbeatService(ILogger<HeartbeatService> l) => _logger = l;
protected override async Task ExecuteAsync(CancellationToken ct)
{
_logger.LogInformation("Heartbeat service started");
while (!ct.IsCancellationRequested)
{
_logger.LogInformation("Heartbeat: {Time}", DateTime.UtcNow);
await Task.Delay(TimeSpan.FromSeconds(30), ct);
}
_logger.LogInformation("Heartbeat service stopping");
}
}
builder.Services.AddHostedService<HeartbeatService>();Kapsamlı Hizmetleri Kullanma
Arka plan hizmetleri tekil örneklerdir. Kapsamlı hizmetleri (örneğin DbContext) kullanmak için her iş birimi başına IServiceScopeFactory kullanarak her zaman yeni bir kapsam oluşturun.
public class DataSyncService : BackgroundService
{
private readonly IServiceScopeFactory _factory;
private readonly ILogger<DataSyncService> _log;
public DataSyncService(IServiceScopeFactory f, ILogger<DataSyncService> l)
{ _factory = f; _log = l; }
protected override async Task ExecuteAsync(CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
using (var scope = _factory.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
await SyncDataAsync(db, ct);
} // scope and DbContext disposed here
await Task.Delay(TimeSpan.FromMinutes(5), ct);
}
}
}Düzgün Kapanma
Ana bilgisayar kapandığında iptal belirtecini tetikler. ExecuteAsync bu belirteci izlemeli ve temizleme işlemlerini gerçekleştirmelidir. Ana bilgisayar zorla durdurulmadan önce varsayılan olarak en fazla 5 saniye bekler.
protected override async Task ExecuteAsync(CancellationToken ct)
{
try
{
while (!ct.IsCancellationRequested)
{
await DoWorkAsync(ct);
await Task.Delay(1000, ct);
}
}
catch (OperationCanceledException)
{
// Normal shutdown — not an error
_logger.LogInformation("Service stopping due to cancellation");
}
finally
{
// Cleanup
await CleanupAsync();
}
}Kanal Tabanlı Arka Plan Kuyruğu
Yaygın bir düzen şöyledir: Arka plan hizmeti bir kanal kuyruğundan okurken HTTP uç noktaları iş öğelerini kuyruğa ekler. Bu yaklaşım, istek işleme ile işlerin yürütülmesini birbirinden ayırır.
public class BackgroundTaskQueue
{
private readonly Channel<Func<CancellationToken, Task>> _queue
= Channel.CreateBounded<Func<CancellationToken, Task>>(100);
public ValueTask QueueAsync(Func<CancellationToken, Task> job)
=> _queue.Writer.WriteAsync(job);
public IAsyncEnumerable<Func<CancellationToken, Task>> DequeueAllAsync(
CancellationToken ct)
=> _queue.Reader.ReadAllAsync(ct);
}
// Register and use:
builder.Services.AddSingleton<BackgroundTaskQueue>();
builder.Services.AddHostedService<QueueProcessorService>();Arka Plan Hizmetlerinde Hata İşleme
ExecuteAsync içindeki işlenmeyen hatalar hizmeti sessizce durdurabilir. Ana döngüyü try/catch içine alın ve tek tek hatalara rağmen hizmetin çalışmaya devam etmesi için hataları günlük kaydına yazın.
protected override async Task ExecuteAsync(CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
try
{
await ProcessNextBatchAsync(ct);
}
catch (OperationCanceledException) when (ct.IsCancellationRequested)
{
break; // normal shutdown
}
catch (Exception ex)
{
_logger.LogError(ex, "Background processing error. Retrying in 5s.");
await Task.Delay(5000, ct); // backoff before retry
}
}
}StopAsync ve Kapanma Zaman Aşımı
Temizleme işlemlerini gerçekleştirmek için StopAsync yöntemini geçersiz kılın. Ana bilgisayar bir kapanma belirteci iletir; temizleme işlemi zaman aşımından uzun sürerse işlem ne olursa olsun sonlandırılır.
public override async Task StopAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("Service is stopping...");
// Signal internal work to stop
_internalCts.Cancel();
// Wait for the Execute loop to complete (up to timeout)
await base.StopAsync(stoppingToken);
_logger.LogInformation("Service stopped");
}
// Increase the shutdown timeout if needed:
builder.Services.Configure<HostOptions>(opt =>
opt.ShutdownTimeout = TimeSpan.FromSeconds(30));Birden Çok Arka Plan Hizmeti
Birden çok barındırılan hizmet kaydedebilirsiniz; bunların tümü eşzamanlı çalışır. Ana bilgisayar hizmetleri sırayla başlatır ve ters sırayla durdurur.
builder.Services.AddHostedService<DatabaseMigratorService>(); // startup task
builder.Services.AddHostedService<MetricsCollectorService>(); // continuous
builder.Services.AddHostedService<EmailNotificationService>(); // continuous
builder.Services.AddHostedService<CacheWarmupService>(); // startup task
// All run concurrently after app start
// Stopped in reverse registration order on shutdownGerçek Dünya: Sipariş İşleme Çalışanı
Veritabanı kuyruğundaki bekleyen siparişleri uygun kapsam ve hata işleme kullanarak işleyen bir arka plan hizmeti.
public class OrderProcessorService : BackgroundService
{
private readonly IServiceScopeFactory _factory;
private readonly ILogger<OrderProcessorService> _log;
public OrderProcessorService(IServiceScopeFactory f, ILogger<OrderProcessorService> l)
{ _factory = f; _log = l; }
protected override async Task ExecuteAsync(CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
try
{
using var scope = _factory.CreateScope();
var processor = scope.ServiceProvider.GetRequiredService<IOrderProcessor>();
int count = await processor.ProcessPendingAsync(ct);
_log.LogInformation("Processed {Count} orders", count);
}
catch (Exception ex) when (!ct.IsCancellationRequested)
{
_log.LogError(ex, "Order processing failed");
}
await Task.Delay(TimeSpan.FromSeconds(10), ct);
}
}
}Kısa Kontrol
Arka plan hizmetleri neden doğrudan DbContext eklemek yerine IServiceScopeFactory kullanmalıdır?
Özet: IHostedService ve BackgroundService
Temel çıkarımlar:
IHostedService: StartAsync/StopAsync — başlatma ve kapatma görevleri içinBackgroundService: ExecuteAsync döngüsü — sürekli arka plan işleri için- Arka plan hizmetlerindeki kapsamlı bağımlılıklar için her zaman
IServiceScopeFactorykullanın - Düzgün kapanma için her await işleminde iptal belirtecini izleyin
- Hizmetin hatalar nedeniyle sonlanmasını önlemek için döngü gövdesini try/catch içine alın
- Temizleme işlemi 5 saniyeden uzun sürüyorsa
HostOptions.ShutdownTimeoutkullanın
Sıkça Sorulan Sorular
“IHostedService ve BackgroundService” dersi ücretsiz mi?
Evet — “IHostedService ve BackgroundService” 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.
“IHostedService ve BackgroundService” dersinde ne öğreneceğim?
Bir .NET konağında arka planda iş çalıştırmak için IHostedService'i ve soyut BackgroundService'i uygulayı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 1. dersidir.
“IHostedService ve BackgroundService” 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