.NET

13 jun, 2018

Tarefas de background com serviços hospedados no ASP.NET Core

Publicidade

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!