Furkan KapukayaYazılım geliştirme
C# ve .NET2 dk okuma

.NET BackgroundService ile Arka Planda Çalışan İşler

.NET'te BackgroundService ve IHostedService ile arka plan işleri yazmak, PeriodicTimer, scoped servis kullanımı, hata yönetimi, Windows Service ve Linux systemd olarak çalıştırma.

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?

  1. ASP.NET Core uygulamasının içinde: Küçük ve web uygulamasıyla ilişkili işler için.
  2. Worker Service projesi: Bağımsız bir arka plan uygulaması.
  3. Windows Service: AddWindowsService() ile Windows hizmeti olarak kurulabilir.
  4. Linux systemd: AddSystemd() ile Linux servis yöneticisiyle uyumlu çalışır.
  5. 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.