Solución:
Del Blog de Rico …
Regla 1
No lo hagas.
Esta es realmente la regla más importante. Es justo decir que la mayoría de los usos de GC.Collect () son una mala idea y entré en eso con cierto detalle en la publicación original, por lo que no repetiré todo eso aquí. Así que pasemos a …
Regla # 2
Considere llamar a GC.Collect () si acaba de ocurrir algún evento no recurrente y es muy probable que este evento haya causado la muerte de muchos objetos antiguos.
Un ejemplo clásico de esto es si está escribiendo una aplicación cliente y muestra un formulario muy grande y complicado que tiene muchos datos asociados. Su usuario acaba de interactuar con este formulario creando potencialmente algunos objetos grandes … cosas como documentos XML o un conjunto de datos grande o dos. Cuando el formulario se cierra, estos objetos están muertos y, por lo tanto, GC.Collect () recuperará la memoria asociada con ellos …
Entonces, parece que esta situación puede caer bajo la Regla # 2, usted sabe que hay un momento en el tiempo en el que muchos objetos viejos han muerto y no es recurrente. Sin embargo, no olvide las palabras de despedida de Rico.
La regla n. ° 1 debería prevalecer sobre la regla n. ° 2 sin pruebas sólidas.
Mide, mide, mide.
Si llama a GC.Collect () en el código de producción, esencialmente está declarando que sabe más que los autores del GC. Ese puede ser el caso. Sin embargo, por lo general no lo es y, por lo tanto, se desaconseja enérgicamente.
Entonces, ¿qué pasa cuando utiliza objetos COM como MS Word o MS Excel de .NET? Sin llamar GC.Collect
después de liberar los objetos COM, descubrimos que las instancias de la aplicación Word o Excel todavía existen.
De hecho, el código que usamos es:
Utils.ReleaseCOMObject(objExcel)
' Call the Garbage Collector twice. The GC needs to be called twice in order to get the
' Finalizers called - the first time in, it simply makes a list of what is to be finalized,
' the second time in, it actually does the finalizing. Only then will the object do its
' automatic ReleaseComObject. Note: Calling the GC is a time-consuming process,
' but one that may be necessary when automating Excel because it is the only way to
' release all the Excel COM objects referenced indirectly.
' Ref: http://www.informit.com/articles/article.aspx?p=1346865&seqNum=5
' Ref: http://support.microsoft.com/default.aspx?scid=KB;EN-US;q317109
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()
GC.WaitForPendingFinalizers()
Entonces, ¿sería un uso incorrecto del recolector de basura? Si es así, ¿cómo conseguimos que mueran los objetos de Interop? Además, si no está destinado a usarse así, ¿por qué GC
‘s Collect
método incluso Public
?