73 votes

Pourquoi est-ce que j'obtiens "Thread was being aborted" en ASP.NET ?

Je ne suis pas sûr de la raison pour laquelle cela se produit et je n'ai jamais explicitement interrompu les threads, donc c'est un peu une surprise. Mais je consigne les exceptions et je vois :

System.Threading.ThreadAbortException - Le fil a été interrompu.

Cela semble se produire lors d'un appel à System.Threading.WaitHandle.WaitOne . Je ne sais pas jusqu'où va cette exception. Je ne pense pas que mes threads se terminent jamais, parce que j'attrape le journal et avale l'erreur.

Pourquoi est-ce que j'obtiens ces erreurs ? Peut-être que c'est lorsque je ferme de force mon serveur ou que je lui demande de redémarrer ? Si ce n'est pas le cas, qu'est-ce qui peut les provoquer ?

0 votes

Pouvez-vous montrer le code que vous avez dans Application_Start ?

0 votes

@rick : Je ne sais pas ce que vous espérez trouver mais voici un extrait. var obj1=new MyServiceObject(); srv1 = new Thread(obj1.Queue); ... srv1.Start() . Notez que obj1 n'est pas à l'intérieur d'un bloc using afin qu'il ne soit pas éliminé prématurément. C'est juste un simple thread que je crée au démarrage.

0 votes

Je pense que votre variable srv1 perd de sa portée et tue le fil. Vous devrez attendre qu'il se termine, ou changer la portée pour une portée de niveau supérieur. (Je réalise que cette réponse a 10 ans de retard ; cependant, j'ai pensé que quelqu'un d'autre pourrait voir cela). J'ai eu un problème similaire avec la journalisation dans une application asp.net - j'essayais de me connecter dans un thread séparé et le thread mourait constamment. Après avoir modifié la portée de la variable à laquelle il était affecté, le ramasseur d'ordures l'a laissé tranquille.

53voto

Icarus Points 36951

Non, ThreadAbortException est déclenchée par une simple Response.Redirect

1 votes

Hmm. Bonne réponse +1 mais ce n'est pas ça. Cela se produit en fait sur les threads que je crée (généralement à partir de Application_Start) et non sur le chemin de requête principal.

1 votes

Ce n'est qu'une façon d'obtenir une ThreadAbortException - vous donnez l'impression que c'est la seule façon. Par exemple, il se peut aussi qu'une requête ait pris plus de 90 secondes et que IIS l'ait tuée.

51voto

rick schott Points 16474

ASP.NET génère et tue des processus de travail tout le temps, selon les besoins. Il se peut que votre fil soit simplement arrêté par ASP.NET.

Vieille réponse :

Problème connu : PRB : ThreadAbortException se produit si vous utilisez Response.End, Response.Redirect, ou Server.Transfer

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

ou

try
{
    Response.Redirect("bla.aspx");
}
catch (ThreadAbortException ex)
{
}

0 votes

Hmm. Bonne réponse +1 mais ce n'est pas ça. Cela se produit en fait sur les threads que je crée (généralement à partir de Application_Start) et non sur le chemin de requête principal.

44voto

Chris Shain Points 33569

Si vous créez des fils dans Application_Start ils seront toujours exécutés dans le pool d'applications. AppDomain .

Si une application est inactive pendant un certain temps (ce qui signifie qu'aucune demande n'est reçue), ou si certaines autres conditions sont remplies, ASP.NET recyclera l'ensemble des AppDomain .

Lorsque cela se produit, tous les fils que vous avez commencé à partir de ce AppDomain y compris ceux de Application_Start sera interrompue.

Cette question en dit beaucoup plus sur les pools d'applications et le recyclage : Qu'est-ce que le recyclage d'Appdomain ?

Si vous essayez d'exécuter un processus de longue durée dans le cadre de l'initiative IIS/ASP.NET la réponse courte est généralement "Ne le faites pas". C'est à cela que servent les services Windows.

0 votes

Cela ressemble exactement à ce qui se passe. J'ai une autre question... Est-ce que Application_Start est exécuté à nouveau lorsque le site redevient actif ? Il semble que non (mais je peux avoir codé quelque chose de mal).

2 votes

Ce n'est pas le cas. D'ici : msdn.microsoft.com/fr/us/library/ms178473.aspx " Les méthodes Application_Start et Application_End sont des méthodes spéciales qui ne représentent pas les événements HttpApplication. ASP.NET les appelle une fois pour toute la durée de vie du domaine d'application, et non pour chaque instance de HttpApplication."

0 votes

Je vois cela se produire avec très peu de temps d'inactivité. Par exemple, entre deux demandes consécutives :/

17voto

Abhimanyu Garg Points 43

Pour un service web hébergé en ASP.NET, la propriété de configuration est executionTimeout :

<configuration> <system.web>

<httpRuntime executionTimeout="360" />

</system.web>

</configuration>

Définissez cette option et l'exception d'interruption du fil disparaîtra :)

0 votes

J'ai trouvé que c'était la solution pour les appels web asynchrones.

8 votes

"Réglez ceci et l'exception d'interruption du fil disparaîtra" pendant quelques minutes ;)

0 votes

Oui, pourquoi s'embêter avec toutes sortes de changements de code quand une seule ligne dans le web.config le fait. Upvoted.

9voto

Jayesh Sorathia Points 832

Ce problème se produit dans le 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 le Server.Execute à la place.

Visitez ce lien pour télécharger un exemple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X