Hilo estaba siendo abortado
-
07-07-2019 - |
Pregunta
Estoy usando Server.Transfer . Todo funciona bien, pero el registro de excepciones muestra la siguiente excepción.
System.Threading.ThreadAbortException: Thread was being aborted.
at System.Threading.Thread.AbortInternal()
at System.Threading.Thread.Abort(Object stateInfo)
at System.Web.HttpResponse.End()
at System.Web.HttpServerUtility.Transfer(String path, Boolean preserveForm)
at System.Web.HttpServerUtility.Transfer(String path)
Cualquier idea para evitar la excepción anterior.
Solución
Esta excepción es lanzada por la llamada a Server.Transfer
para detener la ejecución del método actual: exactamente lo mismo si arroja Response.Redirect
.
Las dos opciones que tiene son:
- Atrapa y vuelve a lanzar
ThreadAbortException / reperform the
Server.Transfer
- Asegúrate de que
solo haga
Server.Transfer
en lugares donde no será atrapado (recomendado)
EDITAR: Rasca eso, http://support.microsoft.com/ kb / 312629 tiene algunas otras sugerencias para probar, pero todavía recomiendo el n. ° 2 anterior.
Otros consejos
Otra forma de resolver esto, es detectar el error generado y no volver a lanzarlo:
catch (ThreadAbortException)
{
}
Caling Server.Transfer llamará a Response.End, que siempre arroja una ThreadAbortException. Este es un "especial" excepción porque, si bien puede capturarse en un bloque de captura, siempre se volverá a lanzar al final del bloque de captura. Me gustaría que su registro de errores ignore ThreadAbortExceptions.
Este problema se produce en los métodos Response.Redirect y Server.Transfer porque ambos métodos llaman a Response.End internamente.
La solución para este problema es la siguiente.
Para Server.Transfer, use el método Server.Execute en su lugar.
Visite este enlace para ver un ejemplo de descarga. http://jayeshsorathia.blogspot.com/2012 /03/thread-was-being-aborted-error-occured.html
Reemplazar Response.End () por lo siguiente ayudó a solucionar el problema.
Response.Flush (); Response.Close ();
Consulte ¿Podemos usar Response.Flush () en lugar de Response.End ()
Reemplace Response.End ()
con HttpContext.Current.ApplicationInstance.CompleteRequest();