GC.Collect
parece iniciar la recolección de elementos no utilizados en un subproceso en segundo plano, y luego volver inmediatamente. ¿Cómo puedo ejecutar GC.Collect
de forma síncrona, es decir, esperar a que se complete la recolección de elementos no utilizados?Ejecute GC.Colgar sincrónicamente
Esto es en el contexto de las pruebas NUnit. Traté de agregar la configuración gcConcurrent al archivo app.config de mi ensamblaje de prueba, e intenté lo mismo con nunit.exe.config. Ninguno tuvo ningún efecto: cuando depuro, todavía puedo ver el finalizador ejecutándose en el "subproceso GC Finalizer", en lugar del subproceso llamado GC.Collect
("TestRunnerThread" de NUnit), y ambos subprocesos se ejecutan al mismo tiempo.
Antecedentes: deseo que mis pruebas fallen si tienen fugas (no llame a Dispose on) en una clase en particular. Así que agregué un finalizador a esa clase que establece un indicador estático wasLeaked
; entonces mi prueba TearDown llama al GC.Collect()
y luego arroja si wasLeaked
es verdadero. Pero no falla de manera determinista, porque cuando lee wasLeaked
, el finalizador generalmente ni siquiera se ha llamado aún. (Falla alguna prueba más adelante en su lugar, después de la recolección de basura, finalmente termina.)
¡Perfecto! Esto es exactamente lo que estaba buscando. ¡Gracias! –