.Net Core Background Task Nedir Ve Nasıl Oluşturulur, Bir Örnekle İnceleme

Abdullah Balıkçı
Crafterdevs
Published in
3 min readApr 12, 2024

Merhabalar ben, Crafter Devs’ten Abdullah. Bu yazıda .Net core ile nasıl Background Task oluştururuz ve nelere dikkat edebiliriz bunu inceleyeceğiz. İlk olarak Background Task Nedir, ona bakalım.

Background Task

Bir uygulamanın ana iş akışı dışında, kullanıcı etkileşimi olmadan veya belirli zamanlayıcılarla çalışan işlemlerdir.

Örnek

T , zamanda sistemdeki tüm veriler silinecek. Silinmesi için şu metot çalışsın.

Peki Ne Zaman Kullanırız

  • Belirli bir süre boyunca bir işin gerçekleştirilmesi, periyodik olarak belirli verilerin güncellenmesi gibi.
  • Uzun sürecek işlemlerin gerçekleştirilmesi. Örneğin, bir dosyanın işlenmesi, e-posta gönderimi gibi işlemler.

En Son yayınlarda kendi geliştirdiğim bir projeden örnek sunacağım ancak şunu bilmeliyiz. .Net Core tarafında kendiniz custom bir şekilde de oluşturabilirsiniz veya hazır kütüphaneler kullanabilirsiniz.

Hangfire ve Quartz.NET

Biz şimdilik custom bir şekilde yapacağız. Şimdi geçelim .Net Core tarafında nasıl yaparız.

İlk Olarak bir sınıf oluşturun ve hangi işlemi yapacaksanız adlandırın. Ardından o sınıf, BackgroundService’i miras alsın.

public class DeterminePenaltyAmountForBorrowing : BackgroundService
{


}

Miras aldıktan sonra bir abstract class’ı implement’e etmenizi isteyecek. Gerekli işlemleri yapın.

public class DeterminePenaltyAmountForBorrowing : BackgroundService
{

protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
throw new NotImplementedException();
}
}

Artık Background Task’ımızı oluşturabiliriz. Asekron çalıştığımız ve işlemleri iptal edebilmek için bir tokken alıyor. Buraya artık istediğiniz görevleri belirtebilirsiniz. Bu kodun çalışması için son bir şey lazım. Program.cs veya herhangi bir IServiceCollection extension metoduna kayıt yapmanız gerekecek.

builder.Services.AddHostedService<DeterminePenaltyAmountForBorrowing>();

Bu kodu yazdıktan sonra artık background Task’iniz çalışacaktır.

Dikkat etmeniz gereken en önemli kısım, Background Task oluşturacağınız sınıfta, servis ve repository’leriniz için doğrudan DI yapmayın çünkü background servis, singleton çalışıyor. Çağırdığınız servis ve repository’ler Scoped çalışırsa hata verecektir. Peki ne yapacağız diye düşünüyorsanız çözüm çok kolay, bunu yapmak için serviceScopeFactory servisi gerekli.

 private readonly IServiceScopeFactory serviceScopeFactory;

Aşağıdaki örnek kodu inceleyerek istediğiniz gibi task oluşturabilirsiniz.



protected async override Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
var now = DateTime.Now;
var nextRunTime = new DateTime(now.Year, now.Month, now.Day, 00, 00, 0);

if (now > nextRunTime)
{
nextRunTime = nextRunTime.AddDays(1);
}
var delayTime = nextRunTime - now;
await Task.Delay(delayTime, stoppingToken);
using (var scope = serviceScopeFactory.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<AppDbContext>();
var _borrowingRepository = scope.ServiceProvider.GetRequiredService<IBorrowingsRepository>();

var getAllData = await _borrowingRepository.GetAllAsync(x => x.IsActive == true && x.IsDelete == false && x.BookStatus.StatusName != "Teslim Edildi", x=> x.BookStatus);

foreach (var item in getAllData)
{
var result = (int)(item.DeliveredTime - item.LastTime).TotalDays;
item.Amount = (int)result * 0.5f;
await dbContext.SaveChangesAsync();
}
};

}
}

Yukarıdaki kodu dikkatli incelerseniz. Scope içerisinden, scope üzerinden servisleri alıyoruz. using bloğu, işimiz bitince Dispose işlemi gerçekleştirecek.

Peki yukardaki kod ne mi yapıyor?

Bu kütüphane bilgi sisteminin bir kodu, tabii demo halinin kodu desem daha doğru olacak. Eğer kullanıcılar kitapları geç getirirse ceza kesiliyor. Her gün saat 00.00'da çalışıyor ve geçiktirilen gün kadar ceza kesiyor. :)

GetRequiredService

Konteyner’dan belirli bir hizmetin nesne örneğini almak için kullanılır. Bağımlılıkları kodun içine doğrudan yerleştirmek yerine, bir konteyner aracılığıyla aldık. Bu sayede herhangi bir hata vermeyecek.

Verdiğim örneği dikkatlice incelerseniz istediğiniz işlemi yapabilirsiniz. Umarım faydalı olmuştur. Görüşmek üzere.

--

--