Novidades do .NET Core 3.0: Worker Services

Renato Groffe
4 min readMay 6, 2019

A possibilidade de implementar em .NET Core rotinas de processamento em background (como Windows Services e Linux Daemons) é uma questão bastante recorrente entre Desenvolvedores desta plataforma. Em um post publicado há algum tempo abordei essa questão, através de uma solução que fazia uso de uma Console Application criada com o .NET Core 2.0 e Docker:

.NET Core + Docker: executando uma Console Application como um serviço

Com o .NET Core 3.0 temos agora uma grande novidade: um template chamado Worker Service, o qual simplifica em muito a implementação de aplicações que serão executadas como processos.

Neste artigo exploro este novo recurso, através da implementação de uma rotina de monitoramento de sites baseada no exemplo do post já mencionado aqui (na época empreguei uma Console Application).

Criando um projeto Worker Service

Para os testes descritos neste artigo utilizei a versão 16.1.0 Preview 2.0 do Visual Studio 2019.

A seguir temos a nova tela de criação de projetos do Visual Studio 2019, sendo necessário selecionar para a criação da aplicação o template ASP.NET Core Web Application:

Preencher na sequência o nome do projeto (MonitoramentoSites para este exemplo):

E concluir este processo selecionando o template Worker Service:

Na próxima imagem é possível observar a estrutura deste novo tipo de projeto, com os arquivos appsettings.json, Program.cs e Worker.cs:

Um Worker Service também pode ser criado via linha de comando, através da instrução dotnet new:

Implementando o Worker Service

O primeiro ajuste envolvendo a implementação do Worker Server será no arquivo appsettings.json, através da inclusão da seção ServiceConfigurations:

  • O item Hosts conterá os domínios/sites a serem verificados;
  • Em Intervalo foi especificado o tempo em milissegundos a ser aguardado para a execução de cada verificação.

Já a classe ServiceConfigurations será empregada na leitura das configurações associadas ao item de mesmo nome em appsettings.json:

O tipo ResultadoMonitoramento conterá informações dos testes envolvendo a disponibilidade de sites/domínios:

O package Microsoft.AspNetCore.Mvc.NewtonsoftJson também será adicionado ao projeto MonitoramentoSites, a fim de permitir o uso de recursos de serialização no padrão JSON:

A classe Program não passará por alterações. Na próxima listagem está o código corresponde a esse tipo, com a classe Worker sendo configurada para execução em CreateHostBuilder:

Ao criar um novo projeto a classe Worker virá por default com um construtor recebendo como parâmetro uma instância de ILogger, além do método ExecuteAsync com um loop para execução (a condição a ser verificada envolve uma checagem do valor associado à propriedade IsCancellationRequested no objeto stoppingToken). A próxima listagem já contempla as alterações esperadas para este tipo:

  • O construtor receberá também uma instância de IConfiguration, que será então empregada no preenchimento de um objeto do tipo ServiceConfigurations;
  • Em ExecuteAsync os diferentes domínios serão verificados a partir do uso de instâncias da classe Ping (namespace System.Net.NetworkInformation). O resultado desses testes serão então atribuídos a objetos baseados no tipo ResultadoMonitoramento;
  • Os métodos LogInformation e LogError serão acionados por meio da instância vinculada a _logger, com a exibição em tela dos resultados dos testes de verificação.

Testes

A seguir temos 2 execuções dos testes de verificação acionados pela aplicação MonitoramentoSites:

--

--

Renato Groffe

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker