Справочная информация: у меня есть простой ASP. NET Core 3.1 сайт. Очень редко (три или четыре раза в неделю) пользователь может заполнить форму, которая инициирует отправку электронного письма.
Я не хочу откладывать ответ страницы во время выполнения операции «отправить письмо» (хотя это занимает всего секунду или две), поэтому из всего, что я прочитал, похоже, что код, который должен обрабатывать электронную почту, должен быть фоновым рабочим / размещенным сервисом и кодом страниц Razor следует поместить объект данных для отправки в коллекцию, которая отслеживается фоновой службой.
Я не совсем понимаю, почему это необходимо в modern ASP. NET Core.
Если бы я делал это в обычном C# приложении (не ASP), я бы просто сделал метод 'send email' asyn c (он использует MailKit, который имеет asyn * 1041) * методы) и вызовите метод asyn c без ожидания, позволяя выполнить работу над пулом потоков, в то же время продолжая поток ответов.
Но в существующих ответах и сообщениях блога говорится, что вызов асин * Метод 1043 * без ожидания в ASP опасен из-за того, что IIS может перезапустить ASP процессы (перезапуск пула приложений).
Тем не менее, большинство вещей, которые я прочитал, говорят, что Application Recycling - это артефакт старого ASP, когда утечки памяти были обычным явлением, и это не совсем так. Net Core. Кроме того, многие приложения ASP даже не размещаются в IIS.
Кроме того, насколько я могу судить, объекты IHostedService / Background Worker не делают ничего особенного - они, кажется, не добавляют любая дополнительная нарезка резьбы; они просто выглядят как синглтоны, которые имеют дополнительное уведомление для запуска и завершения среды.
Итак:
- Вызывает асин c метод пожара и забывания в ASP. NET Ядро все еще считается плохой практикой, особенно если огонь и забыл задача недолговечна? Если так, то почему? [см. правку ниже для пояснения]
- Кроме уведомлений о завершении работы, есть ли причина, по которой фоновая служба считается лучше, чем заимствование управляемого потока пула потоков (через Task.Run или QueueBackgroundWorkItem)? Разве пробуждение фоновой службы (если она ожидает размещения объекта в коллекции) не потребляет поток пула таким же образом?
Edit : я признаю, что запуск задачи и сообщение об успехе пользователю, когда есть вероятность, что операция может быть прервана, является плохой формой. Полезно получать уведомления о завершении работы и возможности завершать задачи.
Возможно, лучший вопрос заключается в том, существует ли старое поведение циклирования в современном ASP (на IIS или Kestrel)? Существуют ли другие причины, по которым может быть запущено правильное завершение работы (кроме выключения сервера / ручной остановки)?