Почему я получаю сообщение «Поток прерывается» в ASP.NET? - PullRequest
49 голосов
/ 03 октября 2011

Я не уверен, почему это происходит, и я никогда не отменяю потоки явно, так что это немного удивительно. Но я регистрирую исключения и вижу:

System.Threading.ThreadAbortException - Поток был прерван.

Похоже, это происходит при звонке на System.Threading.WaitHandle.WaitOne. Я не уверен, насколько далеко заходит это исключение. Я не думаю, что мои потоки когда-либо прерываются, потому что я ловлю журнал и глотаю ошибку.

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

Ответы [ 7 ]

48 голосов
/ 03 октября 2011

Нет, ThreadAbortException выбрасывается простым Response.Redirect

38 голосов
/ 03 октября 2011

Если вы создаете потоки в Application_Start, они все равно будут выполняться в пуле приложений AppDomain.

Если приложение не используется в течение некоторого времени (это означает, что запросы не поступают) или выполнены некоторые другие условия, ASP.NET перезапустит все AppDomain.

Когда это произойдет, все потоки, которые вы запустили с этого AppDomain, включая потоки с Application_Start, будут прерваны.

Многое о пулах приложений и утилизации в этом вопросе: Что такое утилизация Appdomain

Если вы пытаетесь запустить длительный процесс в IIS/ASP.NET, краткий ответ обычно - «Не». Для этого и нужны службы Windows.

34 голосов
/ 03 октября 2011

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)
{
}
14 голосов
/ 03 февраля 2014

Для веб-службы, размещенной в ASP.NET, свойство конфигурации имеет значение executeTimeout:

<configuration> <system.web>

<httpRuntime executionTimeout="360" />

</system.web>

</configuration>

Установите это, и исключение прерывания потока исчезнет:)

9 голосов
/ 17 января 2013

Эта проблема возникает в методах Response.Redirect и Server.Transfer, поскольку оба метода вызывают Response.End внутри.

Решение этой проблемы заключается в следующем.

Для Server.Transfer используйте взамен Server.Execute.

Посетите эту ссылку для загрузки примера.

6 голосов
/ 07 июля 2015

Эта ошибка может быть вызвана попыткой завершить ответ более одного раза. Как уже упоминалось в других ответах, существуют различные методы, которые завершают ответ (например, Response.End или Response.Redirect). Если вы позвоните более одного раза подряд, вы получите эту ошибку.

Я сталкивался с этой ошибкой, когда пытался использовать Response.End после использования Response.TransmitFile, что, похоже, тоже завершает ответ.

1 голос
/ 04 октября 2016

Я получил эту ошибку, когда сделал Response.Redirect после успешного входа пользователя.

Я исправил это, выполнив FormsAuthentication.RedirectFromLoginPage.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...