2011-06-25 13 views
6

Sigo leyendo código y ejemplos de aplicaciones de subprocesos múltiples. De vez en cuando veo un fragmento de este modo:¿Debo mantener una referencia a un hilo una vez que se inició?

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("started"); 
     Go(); 
     Console.WriteLine("press [ENTER] to quit"); 
     Console.ReadLine(); 
    } 

    private static void Go() 
    { 
     var thread = new Thread(DoSomething); 
     thread.Start(); 
    } 

    private static void DoSomething() 
    { 
     Console.WriteLine("doing something"); 
    } 
} 

Y me mantiene molestando: debería mantener la referencia a la (primer plano) de hilo en alguna parte? Después de todo, es una variable local dentro del método Go. Por lo tanto, una vez que se completa la ejecución de Go, la referencia del hilo debe recogerse. Entonces, tal vez, solo tal vez, el hilo será GCed mientras se está ejecutando?

¿Cambiará la respuesta si es un hilo de fondo?

¡Gracias de antemano!

Respuesta

4

Un hilo es un ejemplo de un objeto cuya vida útil es no controlado por el recolector de basura. Debajo del capó es un objeto del sistema operativo. Eso está vivo siempre que un hilo esté ejecutando código. La clase Thread es solo una envoltura para eso. Otro ejemplo es una ventana, está activa siempre que su código o el usuario no lo cierre. Winforms no requiere que tenga una referencia al contenedor de la clase Form. Y que muy habitualmente no lo hace:

Application.Run(new Form1()); 

es el código de placa de la caldera, no mantiene una referencia a la instancia de clase Form1 en cualquier lugar.

Siempre puede volver a crear un objeto Thread a partir de un hilo en ejecución existente. Lo haces con Thread.CurrentThread. Y no tiene que ser un hilo que haya creado con el constructor Thread. Se puede usar dentro de una cadena de subprocesos. O un hilo que no fue iniciado por el código administrado. El hilo principal de su programa sería un buen ejemplo de eso, fue iniciado por Windows.

Sin embargo, perder una referencia a un hilo no es una buena práctica. Implica que no puede verificar que todavía esté ejecutándose. Lo que implica que no puedes detenerlo cuando debería detenerse. Cuando el usuario quiere salir de su programa, por ejemplo.

2

Según this answer, no tiene de qué preocuparse. El GC es lo suficientemente inteligente como para saber si se está utilizando un hilo.

Aquí es un artículo que explica el comportamiento: http://msdn.microsoft.com/en-us/magazine/bb985011.aspx#ctl00_MTContentSelector1_mainContentContainer_ctl03

+0

tiene razón. Nada de qué preocuparse porque un hilo es una raíz de GC. –

+0

Gracias por la respuesta. ¿Alguna posibilidad de una referencia documentada sobre esto? –

+0

Claro, he agregado una referencia. –

2

Sólo es necesario mantener la suspensión de la referencia si desea utilizar más tarde. En este caso, la recolección de basura no se iniciará hasta que el hilo haya terminado.

La única diferencia entre los subprocesos de primer plano y de fondo es que un subproceso en primer plano mantiene el entorno de ejecución administrada en ejecución.

Esto significa que un subproceso en primer plano en ejecución evitará el cierre de la aplicación, mientras que uno de fondo no lo hará.

Source

Cuestiones relacionadas