2008-09-17 9 views
14

En .NET, después de este código, ¿qué mecanismo impide que se recoja el objeto Thread?¿Qué impide que se recolecte un hilo en C#?

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

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

Respuesta

14

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

0

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?

-3

¿Asignar el nuevo subproceso a un campo local?

class YourClass 
{ 
    Thread thread; 

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

Recolección de basura recoge everyting que no es referencias, por lo que en su código no hay ningún campo/de referencia variable al hilo, por lo que será recogido.

+2

No, no lo hará. El tiempo de ejecución guarda una referencia. De lo contrario, se recopilaría un hilo en ejecución si pierde la referencia. – EricSchaefer

2

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

0

punto importante a destacar sin embargo - si el hilo está marcado con IsBackground = verdad, que no impedirá que todo el proceso desde la salida

7

Depende de si el hilo está funcionando 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).

Cuestiones relacionadas