I spawn a worker thread in an ASP.NET application running on Windows Server 2008, IIS 7.5 The first thing this worker thread does is sleep for N seconds, and then it does its real work. During the sleep, a catch a ThreadAbortException.
Can you explain this behavior, and bonus points of you point me to any IIS/ASP.NET settings that can be used to adjust the behavior.
EDIT: More info. The suggestion to catch the ThreadAbortException helped me work around the problem, so thanks. I totally rewrote the wording of this question based on what I learned, but still, the same question, WHY is this worker thread getting aborted during a sleep?
Исключение ThreadAbortException
возникает в вашем рабочем потоке, потому что кто-то еще вызвал в нем Thread.Abort
, так что, вероятно, это не то, что сделал ваш рабочий поток напрямую, а какая-то внешняя причина. Первое, что вы должны проверить, это ваш собственный код для любого управления потоком или прерывания, которое вы можете сделать. В противном случае для 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, в котором выполняется ваш код, добавьте точку останова в потоке .Abort
(может потребоваться включить «пошаговое выполнение исходного кода .NET Framework» в параметрах отладчика) и посмотреть, откуда исходит Abort
с помощью окна стека вызовов. Это не скажет вам, почему это происходит, но, по крайней мере, вы будете знать, кто это делает.