Partilhar via


BackgroundService executa todo o ExecuteAsync como uma tarefa

BackgroundService agora executa a totalidade de ExecuteAsync em um thread de fundo. Anteriormente, a parte síncrona de ExecuteAsync (antes da primeira await) executava-se na thread principal durante a inicialização do serviço, impedindo que outros serviços fossem iniciados. Somente o código após o primeiro await foi executado em um thread em segundo plano.

Versão introduzida

.NET 10

Comportamento anterior

Anteriormente, a parte síncrona do ExecuteAsync era executada na thread principal e bloqueava a inicialização de outros serviços.

Novo comportamento

A partir do .NET 10, todo o ExecuteAsync é executado num thread em segundo plano, e nenhuma parte dele bloqueia a inicialização de outros serviços.

Tipo de mudança disruptiva

Esta alteração é de natureza comportamental .

Motivo da mudança

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

Se você precisar que qualquer parte do seu BackgroundService.ExecuteAsync seja executada anteriormente durante a inicialização (de forma síncrona e bloqueando outros serviços), você pode fazer qualquer um dos seguintes:

  • Coloque o código que precisa ser executado de forma síncrona no construtor, e ele será executado como parte da inicialização do serviço.
  • Sobreponha StartAsync e execute alguma tarefa antes de chamar base.StartAsync. StartAsync Retém o comportamento de que sua parte síncrona é executada de forma síncrona durante a inicialização e bloqueia a inicialização de outros serviços.
  • 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 no seu BackgroundService.
  • Deixe de lado BackgroundService completamente e implemente o seu próprio Microsoft.Extensions.Hosting.IHostedService.

APIs afetadas