Alguns projetos tem a necessidade de rodar tarefas em background de tempos em tempos, e para isso existem diversas opções. Normalmente utiliza-se Windows Services ou ferramentas elegantes , tais como HangFire.
No ASP.NET Core, tarefas de background podem ser criadas por meio de implementação de serviços hospedados.
O que são serviços hospedados
Basicamente, é uma classe com lógicas a serem executadas em background (sem intervenção humana), onde a lógica implementa a interface IHostedService.
Interface IHostedService
Como dito, os serviços hospedados implementam a interface IHostedService, que basicamente expõe dois métodos:
- StartAsync
- StopAsync
O serviço hosteado então é iniciado no Startup da aplicação e termina também quando a aplicação termina. Utilizar a interface IDisposable também é uma boa prática para garantirmos que independente de sucesso ou falha, ao parar a aplicação ou se algum erro aparecer, os recursos serão removidos da memória
Criação do Projeto de Exemplo
No Visual Studio 2017, selecione “File > New > Project”, escolha a opção “ASP.NET Core Web Application” e crie o projeto.
No projeto, crie uma pasta chamada “BackgroundService”, e dentro dela, crie uma classe “ServicoBackground.cs”.
Na classe “Startup.cs”, inclua o trecho de código abaixo, onde iremos registrar o serviço através de injeção de dependência.
Faça a implementação da classe conforme abaixo:
Atente-se nos seguintes aspectos:
- Item 1: estamos implementando IHostedService e IDisposable na classe
- Item 2: criamos variáveis privadas do tipo ILogger e Timer
- Item 3: através de injeção de dependência via construtor, inserimos ILogger na classe
- Item 4: o método StartAsync é o método responsável por iniciar a tarefa
- Item 5: o método ExecutarTarefa é o método que criamos para executar uma determinada tarefa, repetidamente
- Item 6: o método StopAsync é o método responsável por encerrar a tarefa
- Item 7: o método Dispose foi implementado via interface IDisposable, responsável por liberar os recursos utilizados da memória
A implementação do método “StartAsync” basicamente instancia um Timer, passando como parâmetro o método “ExecutarTarefa”, que é o método que implementaremos nossa lógica que precisa ser executada.
Veja também que a periodicidade está sendo determinada através do TimeSpan, ou seja, a cada 10 segundos essa mesma tarefa será executada.
Agora o método “ExecutarTarefa”. Colocaremos uma mensagem de quando o método foi executado para efeito de testes.
E na implementação do método StopAsync, mudaremos o timeout da execução e retornaremos a tarefa como completa.
Resultado da execução
Agora executaremos a aplicação. O método está enviando informações para a janela “Output” do Visual Studio.
Veja que a cada 10 segundos o método é executado em background, em paralelo com a aplicação ASP.NET Core.
Conclusão
Vimos nesse artigo a implementação de tarefas de background no ASP.NET Core 2.0. Existem alternativas para esse comportamento, tais como o Hangfire.io e outros. Analise o que será melhor para seu cenário e coloque em prática!