Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Quando um BackgroundService falha devido a uma exceção em seu método ExecuteAsync e HostOptions.BackgroundServiceExceptionBehavior é definido como StopHost (o padrão), o host é parado. No .NET 11, as tarefas retornadas de RunAsync, StopAsync, WaitForShutdownAsync e seus equivalentes síncronos agora falham com uma exceção em vez de serem concluídas com êxito.
Versão introduzida
.NET 11 Versão Prévia 3
Comportamento anterior
Anteriormente, quando um BackgroundService lançou uma exceção do seu ExecuteAsync método e HostOptions.BackgroundServiceExceptionBehavior foi definido como BackgroundServiceExceptionBehavior.StopHost, a tarefa retornada da chamada RunAsync, StopAsync ou WaitForShutdownAsync foi concluída com êxito. Isso geralmente significava que o aplicativo foi encerrado com um código de saída de êxito (zero).
Novo comportamento
Começando no .NET 11, quando um BackgroundService gera uma exceção de seu método ExecuteAsync e HostOptions.BackgroundServiceExceptionBehavior está definido como BackgroundServiceExceptionBehavior.StopHost, a tarefa retornada da chamada RunAsync, StopAsync ou WaitForShutdownAsync falha com uma exceção. Normalmente, o aplicativo é encerrado com um código de saída de falha (diferente de zero).
- Se um único serviço falhar, a exceção gerada pelo serviço será relançada.
- Se vários serviços falharem, suas exceções serão combinadas em um AggregateException.
Tipo de mudança disruptiva
Essa alteração é uma mudança comportamental.
Razão da alteração
Se um aplicativo for interrompido devido a uma falha, ele não deverá sair com um código de saída bem-sucedido. O comportamento anterior escondeu a falha, tornando mais difícil detectar e diagnosticar a exceção que a causou.
Ação recomendada
A ação recomendada é não fazer nada– um aplicativo com falha deve sair com um código de saída de falha, que é o novo comportamento.
Se você precisar manter o comportamento anterior e sair com um código de saída de êxito, envolva o await de RunAsync ou StopAsync em um bloco try-catch.
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)