net funciona example como collector .net multithreading garbage-collection

.net - example - garbage collector c# como funciona



¿Qué impide que un hilo en C#sea recogido? (6)

Asignar el nuevo subproceso a un campo local?

class YourClass { Thread thread; void Start() { thread = new Thread(Foo); thread.Start(); GC.Collect(); } }

Garbage Collection recopila todo lo que no es referencias, por lo que en su código no hay referencia de campo / variable al hilo, por lo que se recopilará.

En .NET, después de este código, ¿qué mecanismo impide que el objeto Thread sea ​​recolectado como basura?

new Thread(Foo).Start(); GC.Collect();

Sí, es seguro asumir que algo tiene una referencia al hilo, solo estaba deambulando exactamente. Por alguna razón, Reflector no me muestra System.Threading , por lo que no puedo extraerlo yo mismo (sé que MS lanzó el código fuente para el framework .NET, simplemente no lo tengo a mano).


Bueno, es seguro asumir que si un hilo se está ejecutando en algún lugar que algo tiene una referencia, ¿no sería suficiente para detener la recolección de basura?


Es una característica integrada del recolector de basura. Los subprocesos en ejecución no se recopilan.


Depende de si el hilo se está ejecutando o no. Si acaba de crear el objeto Thread y no lo inició, es un objeto administrado ordinario, es decir, elegible para GC. Tan pronto como inicie el subproceso, o cuando obtenga el objeto Subproceso para el subproceso que ya está ejecutándose (GetCurrentThread), es un poco diferente. El "objeto expuesto", Thread gestionado, ahora tiene una referencia fuerte dentro de CLR, por lo que siempre obtendrá la misma instancia. Cuando finaliza el hilo, se lanza esta referencia fuerte, y el objeto gestionado se recopilará tan pronto como no tenga ninguna otra referencia al hilo (ahora muerto).


Importante punto a tener en cuenta: si su hilo está marcado con IsBackground = True, no impedirá que todo el proceso salga


El tiempo de ejecución mantiene una referencia al hilo mientras se está ejecutando. El GC no lo recogerá mientras todo el mundo conserve esa referencia.