2011-10-02 14 views
38

No estoy seguro de por qué sucede esto y nunca aborto explícitamente los hilos, por lo que es un poco sorprendente. Pero registro Excepciones y estoy viendo:¿Por qué me sale "El hilo estaba siendo abortado" en asp.net?

System.Threading.ThreadAbortException - El hilo estaba siendo cancelado.

Parece suceder en una llamada al System.Threading.WaitHandle.WaitOne. No estoy seguro de hasta dónde va esta Excepción. No creo que mis hilos terminen nunca porque capturo el registro y me trago el error.

¿Alguien sabe por qué estoy recibiendo estos errores? ¿Quizás es cuando estoy terminando mi servidor por la fuerza o solicitando que se reinicie? Si no es así, ¿qué podría estar causándoles?

+0

¿Puedes mostrar el código que tienes en Application_Start? –

+0

@rick: no sé qué esperas encontrar pero aquí hay un fragmento. 'var obj1 = new MyServiceObject(); srv1 = new Thread (obj1.Queue); ... srv1.Start() '. Tenga en cuenta que obj1 no está dentro de un bloque en uso, por lo que no se desecha prematuramente. Es solo un hilo sencillo que genero en el inicio –

+0

'Pruebe' esta respuesta .. http://stackoverflow.com/questions/20120800/system-threading-threadabortexception-on-generic-redirection/33999795#33999795 – Moumit

Respuesta

43

No, ThreadAbortException es lanzada por un simple Response.Redirect

+1

hmm. Buena respuesta +1 pero eso no es todo. Esto realmente está sucediendo en los hilos que engendro (generalmente desde Application_Start) y no en la ruta de solicitud principal. –

+0

Esa es solo una forma de obtener una ThreadAbortException: lo haces sonar como si fuera la única manera. P.ej. también podría ser una solicitud que tomó más de 90 segundos, por lo que IIS lo mató. – saille

24

desova ASP.NET y mata los procesos de trabajo todo el tiempo que sea necesario. Su hilo acaba de ser cerrado por ASP.NET.

Antiguo Respuesta:

Problema conocido: PRB: ThreadAbortException Occurs If You Use Response.End, Response.Redirect, or Server.Transfer

Response.Redirect ("bla.aspx", false); 

o

try 
{ 
    Response.Redirect("bla.aspx"); 
} 
catch (ThreadAbortException ex) 
{ 
} 
+0

hmm. Buena respuesta +1 pero eso no es todo. Esto realmente está sucediendo en los hilos que engendro (generalmente desde Application_Start) y no en la ruta de solicitud principal. –

+0

¡esta respuesta me ha ayudado! muchas gracias, estaba perdiendo demasiado tiempo en este tema – Lester

32

Si desovar hilos en Application_Start, todavía estará ejecutando en la AppDomain el grupo de aplicaciones.

Si una aplicación está inactiva durante algún tiempo (lo que significa que no se reciben solicitudes), o se cumplen otras condiciones, ASP.NET reciclará toda AppDomain.

Cuando eso sucede, se anularán los hilos que haya iniciado desde ese AppDomain, incluidos los de Application_Start.

porciones más en grupos de aplicaciones y reciclaje en esta pregunta: What exactly is Appdomain recycling

Si usted está tratando de ejecutar un proceso de larga duración dentro IIS/ASP.NET, la respuesta corta es por lo general "no". Para eso están los servicios de Windows.

+0

Eso suena exactamente como lo que está sucediendo. Tengo otra pregunta ... ¿Se ejecuta de nuevo Application_Start cuando el sitio se vuelve a activar? Parece que no lo es (pero es posible que haya codificado algo incorrecto) –

+2

No lo es. Desde aquí: http://msdn.microsoft.com/en-us/library/ms178473.aspx "Los métodos Application_Start y Application_End son métodos especiales que no representan eventos HttpApplication. ASP.NET los llama una vez durante la vida útil de la aplicación dominio, no para cada instancia de HttpApplication ". –

9

Este problema se produce en los métodos Response.Redirect y Server.Transfer porque ambos métodos llaman internamente al Response.End.

La solución para este problema es la siguiente. Para obtener Server.Transfer, utilice el método Server.Execute.

Visita this link para descargar ejemplos de muestra.

11

Para un servicio web alojado en ASP.NET, la propiedad de configuración es executionTimeout:

<configuration> <system.web> 

<httpRuntime executionTimeout="360" /> 

</system.web> 

</configuration> 

Establecer esto y el hilo abortar excepción desaparecerá :)

+0

Consideró que esta es la solución cuando se realizan llamadas web asincrónicas. – Jonny

+3

"Establezca esto y la excepción de aborto de hilo desaparecerá" ... durante unos minutos;) – saille

+2

@saille 6 minutos para ser exactos ... –

4

Este error puede ser causado por tratar de poner fin a la respuesta más de una vez. Como otras respuestas ya mencionadas hay varios métodos que terminarán una respuesta (como Response.End, o Response.Redirect). Si llama a más de uno en una fila, obtendrá este error.

Me encontré con este error cuando traté de usar Response.End después de usar Response.TransmitFile que parece finalizar la respuesta también.

+0

Las probabilidades son que hacer cualquier cosa con la respuesta después de que se haya terminado podría generar este error. – jahu

0

Recibí este error cuando hice un Response.Redirect después de un inicio de sesión exitoso del usuario.

Lo arreglé haciendo un FormsAuthentication.RedirectFromLoginPage en su lugar.

Cuestiones relacionadas