Compartilhar via


BackgroundService executa todo ExecuteAsync como uma tarefa

BackgroundService agora executa todo o ExecuteAsync em uma thread em segundo plano. Anteriormente, a parte síncrona de ExecuteAsync (antes da primeira await) era executada no thread principal durante a inicialização do serviço, impedindo que outros serviços iniciavam. Somente o código após a primeira await executou em uma thread em segundo plano.

Versão introduzida

.NET 10

Comportamento anterior

Anteriormente, a parte síncrona da ExecuteAsync era executada no thread principal e bloqueava o início de outros serviços.

Novo comportamento

No .NET 10, todas as execuções de ExecuteAsync ocorrem em um thread em segundo plano, e nenhuma parte de ExecuteAsync impede que outros serviços iniciem.

Tipo de mudança disruptiva

Essa alteração é uma mudança comportamental.

Motivo da alteração

O comportamento anterior era uma armadilha comum que não atendia às expectativas do usuário. A maioria dos BackgroundService implementadores não entendeu que a parte síncrona antes do primeiro await bloqueou o início de outros serviços durante a inicialização do aplicativo.

Se você precisar que qualquer parte de sua BackgroundService.ExecuteAsync execução seja executada anteriormente durante a inicialização (de forma síncrona e bloqueando outros serviços), poderá fazer qualquer uma das seguintes ações:

  • Insira o código que precisa ser executado de forma síncrona no construtor, e ele será executado como parte da criação do serviço.
  • Substitua StartAsync e faça algum trabalho antes de chamar base.StartAsync. StartAsync mantém o comportamento de que sua parte síncrona é executada de forma síncrona durante a inicialização e impede que outros serviços sejam iniciados.
  • Se você quiser executar o código em um momento mais específico durante a inicialização do serviço, implemente Microsoft.Extensions.Hosting.IHostedLifecycleService em seu BackgroundService.
  • Abandone BackgroundService completamente e implemente seu próprio Microsoft.Extensions.Hosting.IHostedService.

APIs afetadas