Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Quando um BackgroundService falha com uma exceção do seu ExecuteAsync método e HostOptions.BackgroundServiceExceptionBehavior é definido para StopHost (o padrão), o host para. Em .NET 11, as tarefas retornadas de RunAsync, StopAsync, WaitForShutdownAsync, e os seus equivalentes síncronos falham agora com exceção em vez de serem concluídas com sucesso.
Versão introduzida
.NET 11 Prévia 3
Comportamento anterior
Anteriormente, quando um BackgroundService lançava uma exceção do seu método ExecuteAsync e HostOptions.BackgroundServiceExceptionBehavior era definido como BackgroundServiceExceptionBehavior.StopHost, a tarefa retornada de chamar RunAsync, StopAsync ou WaitForShutdownAsync completava com sucesso. Isto normalmente significava que a aplicação saía com um código de saída de sucesso (zero).
Novo comportamento
A partir de .NET 11, quando um BackgroundService lança uma exceção do seu método ExecuteAsync e HostOptions.BackgroundServiceExceptionBehavior é definido para BackgroundServiceExceptionBehavior.StopHost, a tarefa retornada ao chamar RunAsync, StopAsync ou WaitForShutdownAsync falha com uma exceção. A aplicação normalmente sai com um código de saída de falha (diferente de zero).
- Se um único serviço falhar, a exceção lançada pelo serviço é relançada.
- Se múltiplos serviços falharem, as suas exceções são combinadas num AggregateException.
Tipo de mudança disruptiva
Esta alteração é de natureza comportamental .
Motivo da mudança
Se uma aplicação parar devido a uma falha, não deve sair com um código de saída de sucesso. O comportamento anterior escondia a falha, tornando mais difícil detetar e diagnosticar a exceção que a causou.
Ação recomendada
A ação recomendada é não fazer nada — uma aplicação com falha deve sair com um código de saída de falha, que é o novo comportamento.
Se precisares de manter o comportamento anterior e sair com um código de saída de sucesso, envolve o await de RunAsync ou StopAsync num try-catch bloco:
try
{
await host.RunAsync();
}
catch (Exception ex)
{
// Log or inspect the exception if needed.
}
APIs afetadas
- Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync
- Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run
- Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.StopAsync
- Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.WaitForShutdownAsync
- Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.WaitForShutdown
- Microsoft.Extensions.Hosting.IHost.StopAsync (implementação padrão)