GC.Collect dans une boucle?

J’ai trouvé ce morceau de code dans System.Web.ISAPIRuntime à l’aide de Reflector

public void DoGCCollect() { for (int i = 10; i > 0; i--) { GC.Collect(); } } 

Quelqu’un peut-il commenter cela? Y a-t-il une raison de faire GC.Collect () dans une boucle? Pourquoi 10 fois et pas 3, 5 ou 20? L’parsing a montré que ce n’est pas utilisé dans le cadre .net mais qu’il est public, donc je suppose que IIS pourrait l’appeler …

modifier :

Juste pour clarifier les choses: je n’ai jamais appelé GC.Collect et je n’ai pas l’intention de l’utiliser. Je sais que c’est une mauvaise idée dans la plupart (sinon tous) des cas. La question est de savoir pourquoi .net framework le fait. Merci pour toutes vos réponses.

Je ne pense pas que vous obtiendrez une meilleure explication selon laquelle “l’un des programmeurs de Microsoft n’a aucune idée de ce qu’il se passe et, apparemment, personne d’autre n’a pris la peine de consulter son code avant qu’il ne soit archivé”. 😉

Cela a l’air effrayant cependant.

C’est une réponse assez commune aux bugs que vous ne comprenez pas. Pour une raison quelconque, vous essayez d’appeler le GC et, d’une manière ou d’une autre, le faire ne semble pas résoudre votre problème (peut-être que le vrai problème était simplement d’attendre le fil du finaliseur). La solution naïve est donc la suivante: évidemment “Eh bien, je vais continuer à l’appeler alors”.

Semblable à appuyer sur ‘print’ jusqu’à ce que votre document soit imprimé.

Peut-être devriez-vous le soumettre à thedailywtf.com cependant.

Oui, c’est horrible. Premièrement, vous ne devriez pas avoir besoin de le faire du tout. Cependant, si vous voulez vraiment forcer le ramassage des ordures aussi fort que vous le pouvez et attendez la fin, vous devriez probablement utiliser:

 GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); GC.WaitForPendingFinalizers(); // Collect anything that's just been finalized GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); 

Vraiment pas une bonne idée cependant.

Semble vraiment horrible 🙂

J’aime beaucoup l’implémentation Mono de cette méthode:

 public void DoGCCollect () { // Do nothing. } 

Le développeur avait probablement l’intention d’écrire quelque chose de similaire et il ne s’agit que d’une faute de frappe.

On dirait que quelqu’un avec un complexe apocalyptique l’a écrit avec des connotations sur le fait qu’il finirait le monde avec un chronomètre de 10 secondes …

Des choses comme celle-ci ne devraient-elles pas être signalées à Microsoft? Serait-il utile de publier ceci sur le site Connect?

Ce n’est pas une bonne idée car vous devez vraiment faire confiance au éboueur pour faire son travail sans être appelé spécifiquement à partir de votre code.

99,9% du temps, vous n’avez jamais besoin d’appeler le CPG à partir de votre code.

Tout d’abord, ce n’est pas une bonne idée d’appeler GC.Collect() . L’appeler plusieurs fois a peu d’effet.

Cependant, vous voyez parfois le motif d’appeler Collect() , puis WaitForPendingFinalizers() , puis enfin encore Collect() . L’idée est de s’assurer que les instances avec finaliseurs sont également récupérées, car elles survivront à la première collection. N’oubliez pas que cela entraînera un retard dans l’application et qu’il devrait être très rarement nécessaire.