Belirli aralıklarla stok güncelleyen, kuyruktan mesaj işleyen veya rapor hazırlayan uygulamalar için .NET, BackgroundService adında hazır bir altyapı sunar. Bu altyapı web uygulamalarının içinde veya bağımsız bir worker servisi olarak çalışabilir.
Basit bir örnek
public class StokSenkronServisi(IServiceScopeFactory scopes, ILogger<StokSenkronServisi> logger)
: BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken ct)
{
using var timer = new PeriodicTimer(TimeSpan.FromMinutes(10));
while (await timer.WaitForNextTickAsync(ct))
{
try
{
using var scope = scopes.CreateScope();
var senkron = scope.ServiceProvider.GetRequiredService<IStokSenkron>();
await senkron.CalistirAsync(ct);
}
catch (Exception ex)
{
logger.LogError(ex, "Stok senkronizasyonu başarısız");
}
}
}
}
Önemli noktalar
Scoped servisler için scope oluşturun
BackgroundService singleton olarak yaşar. DbContext gibi scoped servisleri doğrudan constructor'dan almak yerine her çalışmada yeni bir scope oluşturun. Bkz. dependency injection.
PeriodicTimer
PeriodicTimer, Task.Delay döngülerine göre daha okunaklı ve iptal belirteciyle uyumlu bir zamanlama sağlar.
Hata yönetimi
Yakalanmayan bir istisna servisin durmasına yol açabilir. Her döngüyü try-catch ile koruyun, hatayı loglayın ve gerekirse bildirim gönderin. Bkz. .NET'te loglama.
İptal ve kapanış
Uygulama kapanırken CancellationToken iptal edilir. Uzun işlemler bu belirteci dinlemeli ve yarım kalan işi güvenli şekilde bırakmalıdır.
Nerede çalıştırılır?
- ASP.NET Core uygulamasının içinde: Küçük ve web uygulamasıyla ilişkili işler için.
- Worker Service projesi: Bağımsız bir arka plan uygulaması.
- Windows Service:
AddWindowsService()ile Windows hizmeti olarak kurulabilir. - Linux systemd:
AddSystemd()ile Linux servis yöneticisiyle uyumlu çalışır. - Docker konteyneri: Bkz. Docker nedir.
Zamanlanmış görev mi, arka plan servisi mi?
Günde bir kez çalışan basit işler için işletim sisteminin görev zamanlayıcısı yeterli olabilir. Sık çalışan, durum tutan veya kuyruk dinleyen işler için BackgroundService daha uygundur. Bkz. zamanlanmış görevler.
Ana sayfamızdaki örnek
Ana sayfadaki "StokSenkron" konsoluna type Program.cs yazarak AddHostedService ile kurulan benzer bir yapının özetini görebilirsiniz.
Sık sorulan sorular
Birden fazla sunucuda çalışırsa iş iki kez yapılır mı?
Evet, önlem alınmazsa. Dağıtık kilit veya tek örnek çalıştırma stratejisi gerekir.
Çok uzun süren işler için uygun mu?
Uygundur; ancak ilerleme kaydı tutulmalı ve kesintide kaldığı yerden devam edebilmelidir.
Sonuç
BackgroundService, .NET'te güvenilir arka plan işleri yazmanın standart yoludur. Otomasyon servisleriniz için destek alabilirsiniz.