Partilhar via


IHost.RunAsync e IHost.StopAsync lançam quando um BackgroundService falha

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