LongRunningService
Las tareas en segundo plano y los trabajos programados son algo que podría necesitar implementar, eventualmente, en una aplicación basada en microservicio o en cualquier tipo de aplicación. La diferencia cuando se utiliza una arquitectura de microservicios es que puede implementar un único proceso / contenedor de microservicio para alojar estas tareas en segundo plano, de modo que pueda escalarlas según sea necesario o incluso asegurarse de que ejecuta una sola instancia de ese proceso de microservicio / contenedor.
Desde .NET Core 2.0, el framework proporciona una nueva interfaz llamada IHostedService que lo ayuda a implementar fácilmente los servicios alojados. La idea básica es que puede registrar varias tareas (servicios alojados), que se ejecutan en segundo plano mientras se ejecuta su host web o host.
Platform agrega una capa de abstracción sobre esta interfaz, la clase LongRunningService, la cual nos facilita la implementacion, para lo cual debemos sobrescribir lo siguiente:
public abstract string ServiceName { get; }
public abstract Task RunAsync(CancellationToken stoppingToken);
Implementacion¶
A continuación podemos observar un ejemplo de como implementar esta clase:
public class MyHostedService : LongRunningService
{
public override string ServiceName => nameof(MyHostedService);
private readonly ILogger<MyHostedService> _logger;
public MyHostedService(ILogger<MyHostedService> logger)
{
_logger = logger;
}
public override async Task RunAsync(CancellationToken stoppingToken)
{
while(!stoppingToken.IsCancellationRequested)
{
// Implementar logica aqui....
_logger.LogInformation("Running.........");
await Task.Delay(10000, stoppingToken);
}
}
}
public override Task RunAsync(CancellationToken stoppingToken)
{
return Task.Factory.StartNew(obj => {
CancellationToken cancellationToken = (CancellationToken)obj;
while (!stoppingToken.IsCancellationRequested)
{
// Implementar logica aqui....
_logger.LogInformation("Running.........");
Task.Delay(10000).Wait(stoppingToken);
}
}, stoppingToken);
}
Registrando el servicio en el WebHost o Host¶
Para registrar el servicio en el host deberemos utilizar el metodo extendido AddHostedService de la siguiente manera:
public void Configure(HostBuilderContext context, IServiceCollection services)
{
// Add your services here....
services.AddHostedService<MyHostedService>();
}