Каковы некоторые рекомендации по управлению фоновыми потоками в IIS?

Я написал HttpModule, который порождает фоновый поток. Я использую поток как запланированную задачу, которая запускается в процессе, что очень удобно.

Каковы наилучшие методы отслеживания этой темы? Я никогда не делал этого раньше, и я немного смущен некоторыми аспектами этого:

  • Как узнать, работает ли поток? Я вижу, что он выполняет свою работу, но есть ли другой способ узнать, жив ли он еще? Я загрузил ProcMon, но w3wp.exe порождает лодку потоков, поэтому я понятия не имел, что такое мой поток. Я назвал это, но это не помогло.

  • Как я могу "поймать" поток, если он умирает? Есть ли какой-то метод Dispose, где я могу его написать в EventLog или что-то в случае его отказа? "Умирающая декларация" или что-то еще?

  • Как активно остановить поток? Если я хочу, чтобы он прекратил выполнение этого фонового процесса, как мне его убить без необходимости отказов IIS?

  • Есть ли способ запустить его снова, независимо от HttpModule? (Я предполагаю, что ответ на это нет...)

Изменить: Чтобы уточнить, намерение состоит в том, что моя нить никогда не исчезает. Он выполняет функцию, затем ложится спать на пару минут, затем просыпается и снова запускает функцию. Это не похоже на выполнение одной задачи, а затем завершение.

Ответ 1

Из моего опыта вы можете заставить это работать "достаточно хорошо", но не идеально. Я бы рекомендовал реализовать ваши повторяющиеся задачи в службе Windows. В зависимости от того, что делают задачи, службе Windows, возможно, даже не придется разговаривать с веб-приложением или наоборот, например. г. если они работают с одной и той же базой данных. В противном случае вы все равно можете использовать e. г. WCF для связи.

Большое преимущество: служба Windows начнется с ОС, вы можете легко настроить, запустить и остановить ее с помощью панели управления, у вас есть встроенный мониторинг через журнал событий Windows, вы можете обновить фоновое обслуживание и веб-приложение независимо и т.д.

Если это не вариант, e. г. потому что вы находитесь в среде совместного размещения, я бы рекомендовал следующее:

  • Запустите фоновый поток в Application_start (Global.asax) и сохраните ссылку на поток в статической переменной.
  • Оберните каждый метод, вызванный вашим фоновым потоком, с помощью try/catch, потому что с .NET 2.0 каждое необработанное исключение в фоновом потоке отключит приложение. (Он будет перезапущен по следующему запросу, но он замедляет следующий запрос, убивает все текущие сеансы и кеши, и, конечно, никакой таймер не будет активен до следующего запроса.)
  • При каждом запросе (реализованный снова имеет HttpModule или в Global.asax), проверьте экземпляр Thread в глобальной переменной (он все еще!= null, активен и работает поток и т.д.). Если нет, вызовите код перезагрузки. Используйте блокировку в части перезапуска, чтобы убедиться, что поток не будет создан дважды в одно и то же время.

Даже тогда вы не можете быть уверены, что ваш фоновый поток всегда работает, если у вас нет регулярного трафика круглосуточно. Также имейте в виду, что в среде общего хостинга очень часто закрывать пулы приложений, если в течение нескольких часов нет активности. Вы можете попытаться улучшить это, настроив запланированную задачу на клиентской машине в своей собственной сети, выполняющей легкий HTTP-запрос в вашем приложении каждые несколько минут, чтобы убедиться, что ваше приложение всегда работает.

Ответ 2

Когда Джефф сделал Stackoverflow, у него была подобная проблема.

Его решение заключалось в том, чтобы использовать истечение кеша. Вы поместили бы что-то в кеш, а затем, когда он истечет, событие запускается в потоке, не относящемся к пользователю. В обработчике событий для истечения срока действия вы вставляете код для повторного добавления элемента в кеш и выполняете любую работу по ведению домашнего хозяйства для вашего приложения.

Используя эту технику, ваши ответы на вопросы можно легко ответить:

  • Вы проверяете, что элемент все еще находится в Кэш.
  • Если элемент не находится в   кеш, повторно добавить его.
  • Удалите   кеш из кэша.
  • Добавить   элемент возвращается в кэш.

Вы можете создать небольшую страницу управления для настройки этих параметров.

Это дает вам хороший способ ориентироваться в процессе домашнего хозяйства в вашем веб-приложении. Это не требует отдельной службы Windows, что является большой победой.