Почему рабочий поток моего порождения ASP.NET испытывает исключение ThreadAbortException во время сна?

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

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

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


person Corey Trager    schedule 25.08.2010    source источник
comment
Что произойдет, если вы будете спать в течение двух последовательных периодов по 17 секунд или меньше?   -  person Robert Harvey    schedule 25.08.2010
comment
почему бы не попробовать обработать весь обработчик потока и посмотреть, что произойдет? Скорее всего, вы получите ThreadAbortException, в котором может быть что-то полезное.   -  person Ilia G    schedule 25.08.2010
comment
@Robert - нет проблем @liho1eye - подойдет   -  person Corey Trager    schedule 25.08.2010


Ответы (1)


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

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

  • Machine.Config, Web.Config или Global.asax изменены
  • Каталог bin или его содержимое изменены
  • Количество повторных компиляций (aspx, ascx или asax) превышает предел, указанный параметром в machine.config или web.config (по умолчанию установлено значение 15).
  • Физический путь виртуального каталога изменен
  • Политика CAS изменена
  • Веб-служба перезапущена
  • (только 2.0) Подкаталоги приложений удалены

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

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

person Chris Schmich    schedule 25.08.2010
comment
Я не могу отлаживать поток напрямую, потому что проблема возникает на машине хостинг-провайдера, а не на машинах, которые я контролирую. Моя логика не прерывает поток. Тайм-аут простоя по умолчанию составляет минуты, тогда как эта проблема возникает, когда мой поток спит около 20 секунд. Ни одна из других причин для переработки не применима. Ни Response.Redirect, ни Response.End не задействованы. Так что... до сих пор загадка. - person Corey Trager; 25.08.2010
comment
Только что решил мою проблему: мои потоки были прерваны посередине, и это произошло потому, что я писал свои журналы в папку bin (что вызывало сброс IIS)... - person Illidan; 19.10.2014