Использование ЦП, памяти, использование пула потоков - ASP NET core Identity не подтверждена обработка удаления почтовых пользователей - В приложении или отдельном приложении?
Интересно, какое решение более подходящее. Мне нужно внедрить робота для проверки и удаления неподтвержденных зарегистрированных пользователей, например, в течение 7 дней после отправки письма с подтверждением. (Если пользователь не подтверждает свою учетную запись, я хочу удалить пользователя из базы данных). Я думал о 3 способах:
- реализовать делегат в приложении ASP NET core напрямую и запустить его как асинхронную задачу в цикле с 24-часовым режимом сна.
- создать консольное приложение, которое будет работать в цикле с 24-часовым сном
- создать консольное приложение, которое будет регулярно запускаться сторонним программным обеспечением (например, Cron или TaskScheduler)
Какой из этих способов наименее повлияет на использование ЦП и памяти?
Также пул потоков имеет ограниченное количество, чем больше роботов, тем меньше потоков для людей, пытающихся получить доступ к моему сетевому сайту ASP, я прав?
И мой последний вопрос> это хорошая идея для Thread.Sleep так долго? Что-то мне подсказывает, что это не так. С другой стороны, это ASP, который будет работать месяцами, а может и годами.
В любом случае мне нравится идея иметь все в одном приложении (можно настроить в одном файле, и все запускается сразу). С другой стороны, что-то мне подсказывает, что это не самая лучшая идея.
Ответы
Когда задача действительно выполняется, я ожидаю, что в использовании памяти и процессов будет преобладать все, что требуется для задачи, и они должны быть сопоставимы для каждого метода. Так что должно быть интереснее наблюдать за использованием ресурса, когда он не запущен.
- В процессе с использованием таймера (или
await Task.Delay(..)
цикла)
Это потребует только памяти для таймера или асинхронного конечного автомата и некоторой дополнительной памяти для кода. Это должно быть довольно мало, возможно, несколько килобайт. Во время простоя процессорное время и потоки не используются. Это предполагает, что вы не держитесь за какие-либо большие структуры данных.
- В отдельном постоянном консольном процессе
Это потребовало бы нескольких МБ памяти для среды выполнения .Net и некоторой дополнительной памяти для кода и данных. На практике я ожидаю, что память будет выгружена на диск, если у компьютера закончится память. Во время простоя процессорное время не используется.
- В отдельном запланированном консольном процессе
Это будет занимать память только для объекта планировщика, и это должно быть минимальным. Очевидно, что во время простоя процессорное время или потоки не будут использоваться.
Резюме
планирование отдельного процесса потребует минимум ресурсов. Но все методы должны использовать довольно незначительное количество ресурсов в простое. Поэтому я считаю, что выбор следует делать по другим критериям, например по тому, что легче всего поддерживать и / или развертывать.
При необходимости пул потоков выделит больше потоков. В общем случае потоки следует использовать только тогда, когда они действительно что-то делают (т. Е. Используют await task
вместо task.Wait()
), и у вас будет гораздо больше потоков пула потоков, чем у вас будет аппаратных потоков. Я был бы обеспокоен этим, только если бы наблюдал гораздо большее количество потоков, чем обычно.
Я бы Thread.Sleep
по возможности избегал . Таймер или await Task.Delay
обычно более уместен.