Ответ 1
Нет, ThreadAbortException
вызывается простым Response.Redirect
Я не уверен, почему это происходит, и я никогда не отменяю потоки явно, так что это немного удивительно. Но я регистрирую исключения и вижу:
System.Threading.ThreadAbortException - Поток был прерван.
Похоже, это происходит при вызове System.Threading.WaitHandle.WaitOne
. Я не уверен, насколько далеко заходит это исключение. Я не думаю, что мои потоки когда-либо заканчиваются, потому что я ловлю журнал и глотаю ошибку.
Почему я получаю эти ошибки? Возможно, это когда я принудительно завершаю работу моего сервера или прошу его перезагрузить? Если это не так, что может быть причиной их?
Нет, ThreadAbortException
вызывается простым Response.Redirect
Если вы создаете потоки в Application_Start
, они все равно будут выполняться в пуле приложений AppDomain
.
Если приложение какое-то время простаивает (это означает, что запросы не поступают) или выполняются некоторые другие условия, ASP.NET
будет перерабатывать весь AppDomain
.
Когда это произойдет, все потоки, которые вы начали с этого AppDomain
, в том числе из Application_Start
, будут прерваны.
Больше всего на пулах приложений и переработке в этом вопросе: Что такое утилизация Appdomain
Если вы пытаетесь запустить долговременный процесс в IIS/ASP.NET
, короткий ответ обычно "Do not". Для чего предназначены службы Windows.
ASP.NET порождает и убивает рабочие процессы все время по мере необходимости. Ваш поток может просто закрываться ASP.NET.
Старый ответ:
Известная проблема: PRB: ThreadAbortException возникает, если вы используете Response.End, Response.Redirect или Server.Transfer
Response.Redirect ("bla.aspx", false);
или
try
{
Response.Redirect("bla.aspx");
}
catch (ThreadAbortException ex)
{
}
Для веб-службы, размещенной в ASP.NET, свойство конфигурации - это исполнениеTimeout:
<configuration> <system.web>
<httpRuntime executionTimeout="360" />
</system.web>
</configuration>
Установите это, и исключение прерывания потока исчезнет:)
Эта проблема возникает в методах Response.Redirect
и Server.Transfer
, потому что оба метода вызывают Response.End
внутри.
Решение этой проблемы заключается в следующем.
Для Server.Transfer
используйте вместо этого метод Server.Execute
.
Посетите эту ссылку для загрузки примера.
Эта ошибка может быть вызвана попыткой завершить ответ более одного раза. Как уже упоминалось в других ответах, существуют различные методы, которые завершают ответ (например, Response.End
или Response.Redirect
). Если вы позвоните более одного раза подряд, вы получите эту ошибку.
Я столкнулся с этой ошибкой, когда пытался использовать Response.End
после использования Response.TransmitFile
который, кажется, завершает ответ тоже.
Я получил эту ошибку, когда сделал Response.Redirect
после успешного входа пользователя.
Я исправил это, сделав вместо этого FormsAuthentication.RedirectFromLoginPage
.
Я также имею ту же ошибку, когда я пытаюсь вставить в таблицу из запроса выбора. Но когда я выбираю запрос для вставки в таблицу, размер столбца обеих таблиц не одинаков. Следовательно, я получаю эту ошибку.
вставить в tbl_user (имя пользователя, оклад) выбрать имя пользователя, оклад из tbl_user_details;
Размер столбца username в tbl_user равен varchar2 (20), а данные извлекаются из tbl_user_details - 26, следовательно, я получаю ошибку.
Это моя помощь кому-то..