Bu Örnekte .net core 3 ile zamanlanmış (10 saniye de bir) çalışacak basit bir iş parçacığı gösterilmiştir. Kodlara aşağıdaki linkten ulaşabilirsiniz. https://github.com/ibrahimdal/BlogPostApps/tree/master/SampleForGenericHost
-Program.cs
var host = new HostBuilder()
.ConfigureServices((hostContext, services) =>
{
services.AddLogging();
//SampleService classını çalıştırmasını istiyoruz.
services.AddHostedService<SampleService>();
})
.ConfigureLogging((hostContext, configLogging) =>
{
configLogging.AddConsole();
configLogging.AddDebug();
})
.UseConsoleLifetime()
.Build();
await host.RunAsync();
-SampleService.cs
//SampleService classını IHostedService den miras aldırıyoruz.
//Bu sayede clasın bir HostService olduğunu belirtiyoruz.
//Ayrıca classın içerisinde timer kullandığımız için IDisposable interface'inden miras alıyoruz.
//Bunun sebebi servis durdurulduğunda Timer ın dispose etmek istememiz.
public class SampleService : IHostedService, IDisposable
{
private readonly ILogger<SampleService> _logger;
private Timer _timer;
public SampleService(
ILogger<SampleService> logger
)
{
_logger = logger;
}
//Burada IHostedService in StartAsync fonksiyonunu implemente ediyoruz.
//Servis ayağa kalktığında bu kısım çalışıyor.
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Service is starting.");
//servis ayağa kalktığında 10 saniyede bir çalışacak bir timer oluşturuyor.
//timer her trigger olduğunda DoWork fonksiyonunu çalıştıracak.
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
return Task.CompletedTask;
}
//Burada IHostedService in StopAsync fonksiyonunu implemente ediyoruz.
//Servis durduğunda yapılacak işlemleri içine belirtiyoruz.
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Service is stopping.");
//Servis durduğunda timer durdurulacak.
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
//DoWork fonksiyonu bizim asıl yapılmasını istediğimiz işi yapıyor.
private void DoWork(object state)
{
_logger.LogInformation("Service is working.");
}
//Bu kısımda IDisposable interface inin Dispose fonksiyonunu implemente ediyoruz.
//Servis dispose olduğunda bu kısımdaki işlemler yapılacak.
public void Dispose()
{
//IDisposeable interfaceinden miras alan timer nesnesini burada dispose ediyoruz.
_timer?.Dispose();
//Not: Sizin kullanım şeklinize göre başka dispose olabilen nesneler var ise onlarıda burda dispose etmeniz gerekiyor.
}
}