Cómo ejecutar trabajo fire-and-forget de forma segura en ASP.NET Core con BackgroundService
Llamar a Task.Run desde un controlador pierde trabajo al apagar, se traga las excepciones y captura servicios scoped ya desechados. El patrón seguro es una cola Channel acotada que drena un BackgroundService, que abre un scope nuevo por cada elemento de trabajo y termina el trabajo en curso en StopAsync.