Выбор ответа Senior ASP.NET Core обновлено

Фоновая работа в ASP.NET Core

Вопрос

Как правильно выполнять долгую фоновую обработку заказов, которые ставит контроллер?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Очередь (Channel<T или брокер) и BackgroundService со scope на задание. Task.Run без ожидания и async void теряют исключения, не знают о завершении приложения и часто используют уже освобождённый scoped DbContext запроса.

Варианты ответа

  1. Вызвать Task.Run в контроллере и не ждать задачу, ответ уйдёт сразу
  2. Сделать метод контроллера async void, чтобы он не держал запрос
  3. Очередь (Channel<T> или брокер) и BackgroundService со scope на заданиеправильный ответ
  4. Запустить new Thread из конструктора контроллера для каждого заказа

Разбор

Task.Run без ожидания и async void теряют исключения, не знают о завершении приложения и часто используют уже освобождённый scoped DbContext запроса. BackgroundService живёт весь срок приложения, получает stoppingToken для корректной остановки, а scoped-зависимости берёт через IServiceScopeFactory. Если задания должны пережить перезапуск, нужна внешняя очередь (RabbitMQ, таблица outbox) или библиотека вроде Hangfire.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.