web-dev-qa-db-fra.com

Le thread était entrain d'être avorté

J'utilise Server.Transfer. Tout fonctionne bien, mais le journal des exceptions montre 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 pour éviter l'exception ci-dessus.

31
Syed Tayyab Ali

Cette exception est levée par l'appel à Server.Transfer afin d'arrêter l'exécution de la méthode actuelle - exactement la même chose est levée si vous le faites Response.Redirect.

Les deux choix que vous avez sont:

  • Attrapez et relancez la ThreadAbortException/reperform le Server.Transfer
  • Assurez-vous que vous ne faites que Server.Transfer aux endroits où il ne sera pas attrapé (recommandé)

EDIT: Grattez cela, http://support.Microsoft.com/kb/312629 a quelques autres suggestions à essayez, mais je recommande toujours le n ° 2 ci-dessus.

40
Justin

Une autre façon de résoudre ce problème consiste à intercepter l'erreur générée et à ne pas la renvoyer:

        catch (ThreadAbortException)
        { 
        }
9
Chris Ghysbrecht

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 télécharger un exemple d'exemple. http://jayeshsorathia.blogspot.com/2012/03/thread-was-being-aborted-error-occured.html

8
Jayesh Sorathia

Caling Server.Transfer appellera Response.End qui lève toujours une ThreadAbortException. Il s'agit d'une exception "spéciale" car bien qu'elle puisse être interceptée dans un bloc catch, elle sera toujours renvoyée à la fin du bloc catch. Je voudrais que votre journalisation des erreurs ignore les ThreadAbortExceptions.

8
Matt Wrock

Remplacez Response.End() par HttpContext.Current.ApplicationInstance.CompleteRequest();

1
Zuhair Ali

Remplacer Response.End () par ce qui suit a aidé à résoudre le problème.

Response.Flush (); Response.Close ();

Refer Peut-on utiliser Response.Flush () au lieu de Response.End ()

1
user6706374