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:
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:
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:
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:
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:
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.
Para executá-lo, basta iniciar a aplicação normalmente.
Quer alavancar sua carreira como Desenvolvedor(a) .NET?
Opa, aqui é o Luis Felipe (LuisDev), criador do blog LuisDev.
Além de Desenvolvedor .NET Sênior, eu sou instrutor de mais de 700 alunos e também tenho dezenas de mentorados.
Conheça o com mais de 800 video-aulas sobre C# e desenvolvimento de APIs com ASP NET Core, Microsserviços com ASP NET Core, Arquitetura de Software, Computação em Nuvem, SQL, HTML, CSS e JavaScript, JavaScript Intermediário, TypeScript, Desenvolvimento Front-End com Angular, e Desenvolvimento Front-end com React. Diversos mini-cursos disponíveis aos alunos e atualizações gratuitas.
Suporte dedicado, e comunidade de centenas de alunos.
Completo e online, destinado a profissionais que querem dar seu próximo passo em sua carreira como desenvolvedores .NET.
Clique aqui para ter mais informações e garantir sua vaga
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)
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.
Obrigado pelo feedkback, Tulio! Vou verificar aqui a origem do problema.