Выбор ответа Senior ASP.NET Core обновлено
Фоновая работа в ASP.NET Core
Вопрос
Как правильно выполнять долгую фоновую обработку заказов, которые ставит контроллер?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Очередь (Channel<T или брокер) и BackgroundService со scope на задание. Task.Run без ожидания и async void теряют исключения, не знают о завершении приложения и часто используют уже освобождённый scoped DbContext запроса.
Варианты ответа
- Вызвать
Task.Runв контроллере и не ждать задачу, ответ уйдёт сразу - Сделать метод контроллера
async void, чтобы он не держал запрос - Очередь (
Channel<T>или брокер) иBackgroundServiceсо scope на заданиеправильный ответ - Запустить
new Threadиз конструктора контроллера для каждого заказа
Разбор
Task.Run без ожидания и async void теряют исключения, не знают о завершении приложения и часто используют уже освобождённый scoped DbContext запроса. BackgroundService живёт весь срок приложения, получает stoppingToken для корректной остановки, а scoped-зависимости берёт через IServiceScopeFactory. Если задания должны пережить перезапуск, нужна внешняя очередь (RabbitMQ, таблица outbox) или библиотека вроде Hangfire.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.