Como executar trabalho fire-and-forget com segurança no ASP.NET Core com BackgroundService
Chamar Task.Run de um controller perde trabalho ao desligar, engole exceções e captura serviços scoped já descartados. O padrão seguro é uma fila Channel limitada drenada por um BackgroundService, que abre um novo scope por item de trabalho e termina o trabalho em andamento no StopAsync.