web-dev-qa-db-fra.com

L'exception ASP.NET "Le fil a été abandonné" provoque la fermeture de la méthode

Dans le code ci-dessous, someFunctionCall () génère parfois une exception "Le fil a été abandonné". Comment se fait-il que le code du bloc de code B ne s'exécute jamais? ASP.NET démarre-t-il un nouveau thread pour chaque appel de méthode? J'ai été surpris de constater que lorsque cette exception survient, le code du bloc b ne s'exécute jamais, la méthode est renvoyée et mon application continue de s'exécuter. Quelqu'un peut-il s'il vous plaît expliquer cela?

Merci.

public void method()
{
   // CODE BLOCK A
   //...


   try 
   {
       someFunctionCall(); // this call is generating thread abort exception
   }
   catch(Exception ex)
   {
      // log exception message
   }

  // CODE BLOCK B
  // ...

}
20
Ryan Sampson

Ceci est une ThreadAbortException; c'est une exception spéciale qui est automatiquement ré-inversée à la fin de chaque bloc catch, sauf si vous appelez Thread.ResetAbort().

Les méthodes ASP .Net telles que Response.End ou Response.Redirect (à moins que vous ne passiez false) lèvent cette exception pour mettre fin au traitement de la page en cours; Votre someFunctionCall() appelle probablement l'une de ces méthodes.

ASP .Net lui-même gère cette exception et appelle ResetAbort pour poursuivre le traitement.

32
SLaks

Pour contourner ce problème, appliquez l'une des méthodes suivantes: Pour Response.End, appelez la méthode HttpContext.Current.ApplicationInstance.CompleteRequest au lieu de Response.End pour ignorer l'exécution du code dans l'événement Application_EndRequest

Pour Response.Redirect, utilisez une surcharge, Response.Redirect(String url, bool endResponse) qui passe false pour le paramètre endResponse afin de supprimer l'appel interne à Response.End. Par exemple:

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

Si vous utilisez cette solution de contournement, le code qui suit Response.Redirect est exécuté. Pour Server.Transfer, utilisez plutôt la méthode Server.Execute.

1
user3095353