Le thread a été abandonné. [Résolu]

Messages postés
48
Date d'inscription
mardi 7 octobre 2003
Dernière intervention
9 décembre 2008
- 2 oct. 2006 à 20:54 - Dernière réponse :
Messages postés
2
Date d'inscription
lundi 27 janvier 2003
Dernière intervention
11 juillet 2008
- 11 juil. 2008 à 22:22
Bonjour à tous!

J'ai un petit problème d'exception.

Voilà le problème:

Dans mon site ASP-VB.NET framework2, j'utilise le code-behind de plusieurs pages pour faire un traitement de données (enregistrement de données dans un base access) similaire.

Après avoir validé le traitement dans chacune des pages (procédures onclick), je me suis dit que je pouvais simplifier! J'ai donc créé une classe contenant une procédure réalisant le traitement sus-mentionné!

Et le problème est apparu : Le thread a été abandonné.

Pourtant, le traitement des données est bien réalisé! Voici mon code (code-behind d'une page) :

Protected Sub YOUPI_Button_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles YOUPI_Button.Click
   Try
      Dim TOTO As New MACLASS
      MACLASS.MaFonction(TEXT.Text)
      Response.Redirect("page2.aspx")
   Catch ex As Exception
      MsgBox(ex.Message.ToString)
      Response.Redirect("error.aspx")
   End Try
End Sub

Après étude de mon code et grace à des MsgBox bien placés, j'ai pu détecter que le message d'erreur est déclenché par les "Response.Redirect".
Or, ils fonctionnaient correctement avant la mise en classe du traitement de données.

QQ1 aurait-il la réponse à mon problème SVP? Ou tout du moins l'explication du problème?!

Merci d'avance!

 
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
6827
Date d'inscription
dimanche 15 décembre 2002
Dernière intervention
13 octobre 2010
- 2 oct. 2006 à 22:41
1
Merci
Bonsoir, pour différente raison il vaut mieux éviter de mettre les response.redirect dans un bloc try catch. rajouter un Boolean error à l'exterieur de ton bloc try catch et suivant l'etat de la variable tu fais ton response.redirect vers tel ou tel page.

Rapidement voici les raisons pour lesquels il faut éviter le response.redirect dans un bloc try catch, un response.redirect va écrire dans la response une redirection 302 vers ta nouvelle page puis il va quitter le thread de l'execution de la page comme un malpropre ce qui resulte a une exception de type ThreadAbortException or comme tu es dans un bloc try catch tu peux éventuellement avoir un bloc finally qui est toujours executé ...
Si tu n'as pas le choix d'utiliser un response.redirect (ce qui n'est pas ton cas) tu pe ux utiliser response.redirect("lapage", true) ce qui ne quittera pas le thread en cours mais cela va continuer l'execution de la page meme aprés le response.redirect (sans pour autant l'afficher à l'écran).

<hr />Cyril - MVS - MCP

Merci jesusonline 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de jesusonline
Meilleure réponse
Messages postés
48
Date d'inscription
mardi 7 octobre 2003
Dernière intervention
9 décembre 2008
- 3 oct. 2006 à 11:10
1
Merci
Effectivement, je comprends mieux le problème!  Merci!

La solution est donc le code suivant :
Protected Sub YOUPI_Button_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles YOUPI_Button.Click
   Try
      Dim TOTO As New MACLASS
      MACLASS.MaFonction(TEXT.Text)
      Response.Redirect("page2.aspx", False)
   Catch ex As Exception
      MsgBox(ex.Message.ToString)
      Response.Redirect("error.aspx")
   End Try
End Sub

La fonction Response.Redirect est définie comme suit :
Response.Redirect(url As String, [endResponse As Boolean] = True)
endResponse : Indique si l'exécution de la page en cours doît s'arrêter.

Ceci évite l'erreur ThreadAbortException car le thread est quitté proprement cette fois-ci.

Sinon, et si la fin du code de la page doit s'exécuter quand même après la redirection, il faut mettre endResponse a True.

Voilà! Merci encore!

 

Merci v.massip 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de v.massip
Messages postés
6827
Date d'inscription
dimanche 15 décembre 2002
Dernière intervention
13 octobre 2010
- 3 oct. 2006 à 11:18
0
Merci
Non ce n'estpas ce que j'ai dit !

"Si tu n'as pas le choix d'utiliser un response.redirect (ce qui n'est pas ton cas)"

Dans ton cas tu n'as pas besoin d'avoir un response.redirect à l'interieur de ton bloc try catch !!!

Dim error as Boolean = false

try
truc()
catch
error = true
end try

if error then
response.redirec("error.aspx")
else
response.redirec("page2.aspx")
end if

avec ce que tu as fait tu va continuer l'execution de ta page meme aprés le redirect ce qui est complétement inutile et "gourmand" niveau perf.

<hr />Cyril - MVS - MCP
Commenter la réponse de jesusonline
Messages postés
2
Date d'inscription
lundi 27 janvier 2003
Dernière intervention
11 juillet 2008
- 11 juil. 2008 à 22:22
0
Merci
Réponse acceptée !


Effectivement, je comprends mieux le problème!  Merci!

La solution est donc le Protected Sub YOcode suivant :

   Try
      Dim TOTO As New MACLASS
      MACLASS.MaFonction(TEXT.Text)
      Response.Redirect("page2.aspx", False)      '   ------------------>False
   Catch ex As Exception
      MsgBox(ex.Message.ToString)
      Response.Redirect("error.aspx")
   End Try

mezaourou
Commenter la réponse de mezaourou

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.