Le thread était entrain d'être avorté
-
07-07-2019 - |
Question
J'utilise Server.Transfer . Tout fonctionne correctement, mais le journal des exceptions affiche l'exception suivante.
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)
Toute idée d'éviter les exceptions ci-dessus.
La solution
Cette exception est levée par l'appel de Server.Transfer
afin de suspendre l'exécution de la méthode actuelle. La même chose est levée si vous exécutez Response.Redirect
.
Les deux choix que vous avez sont les suivants:
- Attrapez et relancez le
ThreadAbortException / reperformer le
Server.Transfer
- Assurez-vous que vous
Server.Transfer
uniquement à des endroits où il ne sera pas attrapé (recommandé)
MODIFIER: supprimer ce problème, http://support.microsoft.com/ kb / 312629 propose quelques suggestions, mais je recommande tout de même le numéro 2 ci-dessus.
Autres conseils
Une autre façon de résoudre ce problème consiste à intercepter l'erreur générée et à ne pas la rediffuser:
catch (ThreadAbortException)
{
}
Caling Server.Transfer appellera Response.End qui lève toujours une exception ThreadAbortException. Ceci est un "spécial" exception car s'il peut être attrapé dans un bloc catch, il sera toujours jeté à la fin du bloc catch. J'aurais votre journal d'erreur ignorant les ThreadAbortExceptions.
Ce problème se produit dans les méthodes Response.Redirect et Server.Transfer car les deux méthodes appellent Response.End en interne.
La solution à ce problème est la suivante.
Pour Server.Transfer, utilisez plutôt la méthode Server.Execute.
Visitez ce lien pour un exemple de téléchargement. http://jayeshsorathia.blogspot.com/2012 /03/thread-was-being-aborted-error-occured.html
Le remplacement de Response.End () par les éléments suivants a permis de résoudre le problème.
Response.Flush (); Response.Close ();
Consultez Peut-on utiliser Response.Flush () au lieu de Response.End ()
Remplacez Response.End ()
par HttpContext.Current.ApplicationInstance.CompleteRequest ();