Il thread è stato interrotto
-
07-07-2019 - |
Domanda
Sto utilizzando Server.Transfer . Tutto funziona bene, ma il registro delle eccezioni mostra la seguente eccezione.
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)
Qualsiasi idea da evitare al di sopra dell'eccezione.
Soluzione
Questa eccezione viene generata dalla chiamata a Server.Transfer
per interrompere l'esecuzione del metodo corrente: esattamente la stessa cosa viene generata se si esegue Response.Redirect
.
Le due scelte che hai sono:
- Cattura e ricodifica il file
ThreadAbortException / reperform the
Server.Transfer
- Assicurati di te
esegui
Server.Transfer
solo in alcuni punti dove non verrà catturato (consigliato)
EDIT: grattalo, http://support.microsoft.com/ kb / 312629 ha un paio di altri suggerimenti da provare, ma raccomando comunque il n. 2 sopra.
Altri suggerimenti
Un altro modo per risolvere questo problema è quello di catturare l'errore generato e di non riproporlo:
catch (ThreadAbortException)
{
}
Caling Server.Transfer chiamerà Response.End che genera sempre una ThreadAbortException. Questo è un "speciale" eccezione perché mentre può essere catturato in un blocco catch, verrà sempre lanciato alla fine del blocco catch. Vorrei che la tua registrazione degli errori ignorasse ThreadAbortExceptions.
Questo problema si verifica nei metodi Response.Redirect e Server.Transfer perché entrambi i metodi chiamano Response.End internamente.
La soluzione a questo problema è la seguente.
Per Server.Transfer, utilizzare invece il metodo Server.Execute.
Visita questo link per un esempio di download. http://jayeshsorathia.blogspot.com/2012 /03/thread-was-being-aborted-error-occured.html
La sostituzione di Response.End () con il seguente ha aiutato a risolvere il problema.
Response.Flush (); Response.Close ();
Consulta Possiamo usare Response.Flush () invece di Response.End ()
Sostituisci Response.End ()
con HttpContext.Current.ApplicationInstance.CompleteRequest();