Criando rotinas com ASP.NET Core e HostedServices

Aprenda a como criar os chamados “jobs” usando C# e ASP.NET Core


Após publicar sobre Serilog e Fluent Validations, volto com mais um artigo prático e breve, com foco em atender uma necessidade comum de desenvolvimento em projetos.

Como desenvolvedores, acredito que é muito possível termos encontrado algum problema do tipo:

  • Preciso fazer esse processamento 1 vez por dia;
  • A cada 10 minutos preciso checar os pedidos disponíveis e fazer uma atualização dos seus status;

Bom, tem N motivos pelos quais precisaríamos que um certo código nosso precise ser executado com certa frequência. Isso requer a execução de uma tarefa em segundo plano, comumente também chamado de “job” ou “rotina”.

Com o ASP.NET Core, conseguimos fazer isso com um recurso “nativo” do framework chamado HostedService, sem a necessidade de utilizar uma ferramenta externa como o Hangfire.

Tenho utilizado em alguns projetos e tem atendido bem!

Como exemplo neste artigo, vou usar um problema com que me deparei faz um par de anos: registro de boletos gerados. O objetivo era desenvolver uma rotina que buscaria os boletos pendentes de registro, os registraria e marcaria como registrados. Na época utilizei um Windows Service.

Código do artigo:

luisdeol/artigo-hostedservice

Vamos lá?


Sobre a interface IHostedService

Tudo começa por essa interface. 

Para começar a desenvolver seu código que será executado em uma rotina/intervalo, começamos implementando a interface IHostedService.

Ela contém dois métodos:

  • StartAsync: conterá o código que você quer que seja executado, e é executado quando a aplicação inicia. Porém, como veremos a seguir, é possível adicionar um timer para que o método seja executado a cada intervalo definido.
  • StopASync: executado quando a aplicação encerra. Aqui normalmente você vai querer liberar recursos não- gerenciados da sua rotina (Dispose).

Código:

Estrutura de um HostedService

Criando uma tarefa em segundo plano e adicionando código

Antes de qualquer coisa, vamos adicionar essa classe que implementa o IHostedService aos serviços executados na nossa classe Startup.cs.

Código:

Adicionando o serviço HostedService em nossa aplicação

Com isso, nosso serviço será adicionado à aplicação quando esta for iniciada.

Após isso, vamos utilizar a classe Timer (do namespace System.Threading) para definir o intervalo e o método a ser executado neste. É importante ressaltar que os tempos de intervalo e início estão em milisegundos. O terceiro parâmetro contém o tempo de início (ou seja, pela imagem, será executado imediatamente) e tempo de intervalo (no caso, 100000ms, que corresponde a 100 segundos).

Código:

Estruturando o HostedService

Uma questão que surge agora é: e se eu quiser utilizar uma classe como um Repositório ou Service, como posso obter esses objetos através de injeção de dependência?


Lidando com Serviços de Escopo (Injeção de Dependência)

Para acessar serviços de escopo, precisamos utilizar a instância injetadado IServiceProvider. Armazenamos ela então em uma propriedade da nossa classe e a utilizamos da maneira adequada, criando um escopo.

Após isso, com o uso do método GetRequiredService<T> conseguimos obter a instância necessária, e já utilizá-la em seguida:

Código:

Implementação do HostedService

Lembrando para configurar a injeção das dependências de maneira apropriada na classe Startup.


Código completo e execução

Abaixo mostro o código completo do exemplo criado.

Código completo

Para executá-lo, basta iniciar a aplicação normalmente. 

Execução do projeto

Se curtiu este artigo e tem interesse em alcançar o próximo nível em .NET, se destacando em sua equipe e mercado, se inscreva no Método .NET Direto ao Ponto. Inscreva-se aqui.

São quase 200 vídeo-aulas sobre temas como C#, ASP NET Core 5, EF Core, CQRS, Clean Architecture, Autenticação e autorização com JWT, Testes Unitários, além de mini-cursos em Microsserviços, Performance em .NET, ASP NET Core e Azure, Docker, Carreira Internacional em .NET, e mais.

Conclusão

Simples até, certo? Que tipos de problemas vocês já encontraram e que exigiam fazer algo do tipo (não importa como fizeram) para resolver? Compartilha aí!

Bom, espero que os tenha sido útil. Se tiver algum tema que você tem interesse que seja abordado por mim em um novo artigo, compartilhe comigo! Pode ser via comentário aqui ou em qualquer artigo que eu já tenha publicado!

Referências

Tarefas em segundo plano com serviços hospedados no ASP.NET Core (Microsoft Docs)

  1. Túlio Paim

    Olá, parabéns pelos artigos, são excelentes.
    Só para avisar, vi que existem alguns como este em que as imagens estão indisponíveis.

Comments are closed.
%d blogueiros gostam disto: