Skip to content

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);
      }
    }
  }
Otra forma de implementar el metodo RunAsync en caso de que no podamos usar await dentro del metodo, es la siguiente:

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