Novidades do .NET 8: melhorias na implementação de serviços com IHostedLifecycleService
A interface IHostedService está presente desde o .NET Core 2.0, sendo comumente empregada na construção de serviços para execução em background. Um caso comum de uso dessa estrutura está na implementação de consumers de soluções de mensageria, com os processamentos de mensagens de filas e tópicos do Azure Service Bus representando ótimos exemplos de utilização deste recurso.
Os links a seguir são de 2 repositórios em que fiz uso de IHostedService, consumindo mensagens a partir de filas e tópicos do Azure Service Bus:
https://github.com/renatogroffe/DotNet7-Worker-AzureServiceBus-Queue-ServiceBusClient_Consumer
Já na listagem seguinte temos um exemplo de Worker Service que utiliza IHostedService, implementando os 2 métodos exigidos por esta interface (StartAsync e StopAsync):
No .NET 8 as capacidades originais de IHostedService foram estendidas, através de um novo tipo derivado dessa estrutura: a interface IHostedLifecycleService (também pertencente ao namespace Microsoft.Extensions.Hosting).
Além de StartAsync e StopAsync, a interface IHostedLifecycleService espera que sejam implementados os seguintes métodos:
- StartingAsync (executado antes de StartAsync);
- StartedAsync (executado depois de StartAsync);
- StoppingAsync (executado antes de StopAsync);
- StoppedAsync (executado depois de StopAsync).
Na próxima listagem temos uma variação do primeiro exemplo, empregando agora as novas capacidades da interface IHostedLifecycleService:
- A inicialização da instância do tipo Timer (namespace System.Threading) foi transferida agora para StartingAsync, com uma chamada a Change em StartAsync habilitando a execução deste objeto a cada 1 segundo (e esperando 5 segundos para iniciar este processo);
- Foram implementados ainda os métodos StartedAsync, StoppingAsync e StoppedAsync.
O código que define a classe ApplicationState pode ser observado na listagem a seguir:
Nos próximos prints temos o resultado da execução deste Worker Service a partir do Visual Studio 2022:
A animação a seguir mostra cada estágio inicial de execução envolvendo a utilização de IHostedLifecycleService:
Já na próxima animação está o que acontece ao se interromper a execução do serviço:
O código desta aplicação foi disponibilizado no GitHub:
https://github.com/renatogroffe/DotNet8-WorkerService-IHostedLifecycleService
Caso achem útil esta solução, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá no GitHub!