2009-10-11 13 views
6

Soy nuevo en C#. Aprendí que normalmente todos los subprocesos están en primer plano hasta que a menos que lo especifique explícitamente como subproceso "de fondo" utilizando IsBackGround = verdadero.Subprocesos de fondo en C#

Algunas dudas aparecieron en mi mente.

1) ¿Cuál es la ventaja de mantener un hilo como hilo de fondo?

2) Cuando se ejecuta el código folowing:

static void Main(string[] args) 
    { 
     Thread worker = new Thread(SayHello); 
     worker.IsBackground = true; 
     worker.Start(); 
     Console.WriteLine("Hello From Main"); 
    } 

    static void SayHello() 
    { 
     Console.WriteLine("Hello World"); 
     Console.ReadKey(true); 
    } 

i necesidad de utilizar worker.Join() para mantener el hilo principal para esperar que el programa termina inmediatamente. Además de Join(), ¿podría utilizar otras técnicas para mantener el hilo principal en espera?

+3

enhebrar en C# es algo bastante interesante. Recomiendo encarecidamente el libro ClR via C# de Jeffrey Richter. Tiene una explicación del kernel de Windows sobre cómo funcionan los hilos en C#. Desafortunadamente, muchos de estos conceptos recaen en C++ Win32 threading api. – Spence

+3

Te divertirás más con la sincronización de subprocesos. Eche un vistazo al Sistema.Threading.Semaphore, ManualResetEvent, AutoResetEvent, Mutex y clases entrelazadas. Todos son muy útiles para hacer threading cosas. – Spence

+0

Gracias Spence Muchas gracias. Lo echaré un vistazo. – user186973

Respuesta

11

1) ¿Cuál es la ventaja de mantener un hilo como hilo de fondo?

La ventaja es que un hilo de fondo no detiene la finalización del programa. En una aplicación grande, puede ser un poco difícil desactivar todos los subprocesos si desea salir de la aplicación.

Aparte de Join() ¿podría utilizar otras técnicas para mantener la espera del hilo principal?

Si desea hacer que el programa principal espere, ¿por qué hace que el hilo sea un hilo de fondo en primer lugar, entonces? Además de Join(), puede usar un EventWaitHandle o Monitor para hacer que el método principal espere.

6

Todo lo que significa es si este hilo mantendrá vivo el proceso. Si todos los hilos en su proceso están marcados como fondo, .Net cortará su proceso y lo forzará a salir.

En respuesta a su pregunta, sí debe unirse ya que el hilo que está en segundo plano no lo mantendrá con vida, por lo tanto, cuando el hilo de inicio abandona Main(), entonces permitirá que la aplicación salga.

3

Si el hilo debe completarse antes de que termine el programa, entonces no debe ser un hilo de fondo.

Hay muchas maneras de hacer que su hilo principal espere, pero en el ejemplo anterior creo que lo que realmente quiere hacer es asegurarse de que no sea un hilo de fondo.

El método de unión generalmente se utiliza para asegurarse de que los subprocesos se ejecutan antes de que continúe el hilo de llamada. Por ejemplo, puede engendrar 5 hilos que hacen cada operación matemática y los resultados de esas operaciones pueden ser necesarios para avanzar con el siguiente paso. El método Join pausará la ejecución en el hilo de llamada hasta que los hilos engendrados puedan completarse. Es importante tener en cuenta que si llama a Join from the UI thread, congelará su programa hasta que los hilos generados terminen.

En resumen, multi-threading es realmente complicado y matizado. Recomiendo comprar un buen libro sobre el tema.

Cuestiones relacionadas