Compartilhar via


IHost.RunAsync e IHost.StopAsync são lançados quando um BackgroundService falha

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 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