2009-03-17 7 views
11

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

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

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

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

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

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

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

+0

Вы получаете сообщение об ошибке system.timeout? – TStamper

+0

пренебрежение. которые не должны применяться к этому – TStamper

ответ

6

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

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

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

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

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

9

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

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

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

  1. Вы проверяете элемент по-прежнему в кеш.
  2. Если элемент не находится в кеше , добавьте его повторно.
  3. Удалить кеш-код из кеша.
  4. Добавить элемент обратно в кэш.

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

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