2010-08-25 18 views
6

Я создаю рабочий поток в приложении ASP.NET, работающем на Windows Server 2008, IIS 7.5. Первое, что делает этот рабочий поток, - сон в течение N секунд, а затем он выполняет свою настоящую работу. Во время сна поймайте ThreadAbortException.Почему рабочий поток, связанный с созданием ASP.NET, создает исключение ThreadAbortException во время сна?

Можете ли вы объяснить это поведение, и бонусные баллы указывают мне на какие-либо параметры IIS/ASP.NET, которые можно использовать для настройки поведения.

EDIT: дополнительная информация. Предложение поймать ThreadAbortException помогло мне решить проблему, поэтому спасибо. Я полностью переписал формулировку этого вопроса, основываясь на том, что я узнал, но тем не менее, тот же вопрос, ПОЧЕМУ это рабочая нить, которая прерывается во время сна?

+0

Что произойдет, если вы спите в течение двух последовательных 17 секунд или менее периодов? –

+2

Почему бы не попытаться захватить весь обработчик потока и посмотреть, что произойдет? Скорее всего, вы получите ThreadAbortException, у которого может быть что-то полезное. –

+0

@Robert - нет проблем @ liho1eye - will do –

ответ

6

А ThreadAbortException происходит на вашей рабочей нити, потому что кто-то еще вызвал на него Thread.Abort, поэтому, вероятно, ничего не случилось, что ваш рабочий поток сделал, а скорее какая-то внешняя причина. Первое место, которое вы должны проверить, это ваш собственный код для любого управления потоками или прерывания, которое вы можете сделать. В противном случае для IIS это может быть связано с рабочим процессом (w3wp.exe) или пулом приложений или с повторной обработкой AppDomain.

Утилизация может быть вызвана настройкой тайм-аута простоя для пула приложений, регулярно запланированной утилизации или триггера использования памяти/процессора. Они настраиваются через диспетчер конфигурации IIS в Server Explorer (на Win 2K8) или просто запускают inetmgr.exe. Согласно блогу Тесс here, существует целый ряд других причин для утилизации AppDomain:

  • Machine.config, Web.Config или Global.asax модифицируются
  • каталог бен или его содержимое изменяется
  • число повторных сборниках (ASPX, ASCX или asax) превышает предел, указанный установкой в machine.config или web.config (по умолчанию это установлено значение 15)
  • Значение рН ysical путь виртуального каталога модифицируется
  • политика CAS модифицируется
  • Веб-сервис перезапускается
  • (только 2,0) Применение Подкаталоги удаляются

Этот блог также имеет информация о отслеживании причин, по которым произошла переработка. Для начала попробуйте посмотреть в журнале событий (eventvwr.msc), чтобы узнать, есть ли какая-либо подробная информация.

Вы также можете попробовать отладить рабочий процесс напрямую. Прикрепите VS-отладчик VS к экземпляру w3wp.exe, где выполняется ваш код, добавьте точку останова на Thread.Abort (возможно, вам потребуется включить «Шаблоны исходного кода .NET Framework» в параметрах отладчика) и посмотреть, откуда происходит Abort, используя окна стека вызовов. Это не скажет вам, почему это происходит, но по крайней мере вы узнаете, кто это делает.

+0

Я не могу отлаживать поток напрямую, потому что проблема возникает на машине хостинг-провайдера, но не на машинах, которые я контролирую.Моя логика не прерывает поток. Тайм-аут по умолчанию - это минуты, тогда как эта проблема возникает, когда мой поток спит 20 или около того секунд. Ни одна из других причин рециркуляции не применяется. No Response.Redirect или Response.End задействован. Итак ... еще загадка. –

+0

Только что решил мою проблему: мои потоки были прерваны посередине, и это произошло из-за того, что я записывал свои журналы в папку «bin» (что вызывало сброс IIS) ... – Illidan