c# - traduccion - garbage collector yugioh
GC.Collect en un bucle? (8)
Encontré esta pieza de código dentro de System.Web.ISAPIRuntime usando Reflector
public void DoGCCollect()
{
for (int i = 10; i > 0; i--)
{
GC.Collect();
}
}
¿Alguien puede comentar sobre esto? ¿Hay alguna razón para hacer GC.Collect () en un bucle? ¿Por qué 10 veces y no 3, 5 o 20? El análisis indicó que no se usa dentro de .net framework, pero es público, así que supongo que IIS podría llamarlo ...
editar:
Solo para propósitos de aclaración: nunca he llamado a GC.Collect y no tengo intenciones de usarlo. Sé que es una mala idea en la mayoría de los casos (si no todos). La pregunta es por qué .net framework lo hace. Gracias por todas sus respuestas.
¿No deberían señalarse cosas como esta a Microsoft? ¿Sería bueno publicar esto en el sitio de Connect?
En primer lugar, no es una buena idea llamar a GC.Collect()
. Llamarlo varias veces tiene poco efecto.
Sin embargo, a veces ve el patrón de llamar a Collect()
, luego a WaitForPendingFinalizers()
y, finalmente, a Collect()
nuevo. La idea detrás de esto es asegurar que las instancias con finalizadores también se recuperen, ya que sobrevivirán a la primera colección. Tenga en cuenta que esto provocará un retraso en la aplicación y que rara vez será necesario.
Esta no es una buena idea porque realmente deberías confiar en que el recolector de basura haga su trabajo sin ser invocado específicamente desde tu código.
El 99.9% del tiempo nunca necesita llamar al GC desde su código.
No creo que vayas a obtener una mejor explicación de que "uno de los programadores de Microsoft no tiene ni idea, y al parecer, nadie más se molestó en mirar su código antes de que lo registraran". ;)
Aunque parece aterrador.
Aunque es una respuesta bastante común a los errores que no entiendes. Por la razón que sea, estás intentando llamar al GC, y de alguna manera, al hacerlo no parece resolver tu problema (quizás el problema real fue que deberías esperar el hilo finalizador o algo así), por lo que la solución ingenua es obviamente "bueno, seguiré llamándolo entonces".
Similar a presionar ''imprimir'' repetidamente hasta que se imprima su documento.
Quizás deberías enviarlo a thedailywtf.com sin embargo.
Parece que alguien con un complejo del fin del mundo lo escribió con connotaciones de que estarían acabando el mundo con un temporizador de 10 segundos ...
Parece realmente horrible :)
Realmente me gusta la implementación Mono de este método:
public void DoGCCollect ()
{
// Do nothing.
}
Probablemente el desarrollador intentó escribir algo similar y esto es solo un error tipográfico.
Sí, eso es horrible. En primer lugar, no deberías necesitar hacerlo en absoluto. Sin embargo, si realmente quieres forzar la recolección de basura tan duro como puedas, y esperar a que finalice, probablemente deberías usar:
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
// Collect anything that''s just been finalized
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
Aunque realmente no es una buena idea.