Skip to content

BackgroundService

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.

BackgroundService base class

BackgroundService es una clase base para implementar un IHostedService de larga ejecución. Se llama a ExecuteAsync(CancellationToken) para ejecutar el servicio en segundo plano. La implementación devuelve una tarea que representa la vida útil completa del servicio en segundo plano. No se inician más servicios hasta que ExecuteAsync se vuelve asincrónico, por tal motivo se debe realizar un llamando con await. Evite realizar un trabajo de inicialización de bloqueo prolongado en ExecuteAsync. El host bloquea en StopAsync(CancellationToken) esperando que se complete ExecuteAsync.

El token de cancelación se activa cuando se llama a IHostedService.StopAsync. Su implementación de ExecuteAsync debería finalizar de inmediato cuando se active el token de cancelación para cerrar correctamente el servicio. De lo contrario, el servicio se apaga sin gracia en el tiempo de espera de cierre.

Implementacion

A continuación podemos observar un ejemplo de como implementar esta clase:

  public class MyHostedService : BackgroundService
  {
    private readonly ILogger<MyHostedService> _logger;

    public MyHostedService(ILogger<MyHostedService> logger)
    {
      _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
      while(!stoppingToken.IsCancellationRequested)
      {
        // Implementar logica aqui....
        _logger.LogInformation("Running.........");
        await Task.Delay(10000, stoppingToken);
      }
    }
  }

IMPORTANTE

No se iniciaran más servicios hasta que ExecuteAsync se vuelve asincrónico, por tal motivo se debe realizar un llamando con await dentro del metodo.

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>();
    }