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
// ...
}
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.
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
.