2009-11-10 17 views
7

Al crear una nueva instancia de System.Thread, el valor predeterminado de IsBackground es falso. ¿Alguien puede arrojar luz sobre por qué este sería el valor predeterminado no sería cierto. Mi inclinación, correcta o no, al crear un hilo es que se ejecutaría en el fondo del hilo principal.C# Creación de hilo Pregunta

Gracias por las respuestas rápidas.

Proporciono la funcionalidad en el destructor de mi componente para permitir que el subproceso termine gracefullly. Estoy usando un ManualResetEvent y Join.

Entiendo perfectamente que permitir que el hilo termine con elegancia es correcto y correcto. Lo que no estoy conceptualizando es por qué. de forma predeterminada, un hilo debe colgar una aplicación completa si no finaliza correctamente cuando la aplicación está saliendo.

Respuesta

22

IsBackground significa que el hilo es terminado cuando finaliza la aplicación. Este comportamiento rara vez es deseable, porque significa que el hilo no puede detenerse y limpiarse correctamente.

En su lugar, la aplicación debe indicar que el subproceso finaliza, espere hasta que lo haya hecho y luego cierre correctamente.

Esa es mi resumen de esta nota publicitaria de la Thread.IsBackground MSDN article:

Un hilo es o bien un subproceso de fondo o un hilo plano. Los hilos de fondo son idénticos a los hilos de primer plano , excepto que los hilos de fondo no impiden que finalice un proceso de . Una vez terminados todos los hilos de primer plano que pertenecen a un proceso , el tiempo de ejecución de lenguaje común finaliza el proceso. Cualquier hilos de fondo restantes son detenidos y no se completan.

4

Esta información de la página MSDN en IsBackground explica la diferencia entre los hilos de fondo y de primer plano.

Un subproceso es un subproceso o un subproceso en primer plano. Los subprocesos de fondo son idénticos a los subprocesos de primer plano, excepto que los subprocesos de fondo no impiden que un proceso finalice. Una vez que todos los hilos de primer plano que pertenecen a un proceso han terminado, el tiempo de ejecución de lenguaje común finaliza el proceso. Los hilos de fondo restantes se detienen y no se completan.

2

Normalmente, en .NET, si va a crear su propio hilo, será para un proceso largo. En esta situación, normalmente no desea que se destruya el hilo si el usuario cierra su formulario principal. En su lugar, desearía tener una buena oportunidad para manejar la limpieza correctamente.

Si solo desea ejecutar un elemento de trabajo rápido en una cadena de fondo, use ThreadPool. Esto normalmente será mucho mejor para cualquier cosa que no sea un elemento de trabajo de larga ejecución.

+0

o use la clase BackgroundWorker. – TheSean

+0

BackgroundWorker usa ThreadPool, al igual que el nuevo paradigma de tareas en .NET 4, así que los estaba tratando a todos como parte del uso de ThreadPool. –

0

> Entiendo completamente que permite al hilo para terminar con gracia es correcto y digno, pero lo que me falta es que por eso por defecto un hilo debe pasar toda una aplicación si no termina con éxito. < <

A menos que esos hilos fondo están haciendo algo muy inofensivo, puede ser mejor para colgar el proceso (por poco tiempo - hasta que la salida) que obligarlos a cerrar - si hacerlos hilos de fondo, no tienes control sobre lo que están haciendo cuando salen. Una alternativa sería realizar un seguimiento de las tareas que tiene en ejecución en los hilos "de fondo". Cuando el hilo principal quiere cerrarse, debe indicar a los hilos que deben cancelarse y darles la oportunidad de salir con gracia. Si no pueden salir correctamente, puedes abortarlos (o dejarlos configurados como fondo, pero no dejes que salga tu hilo principal hasta que estés listo para finalizar los hilos de fondo). Solo tenga en cuenta que podría pasar algo malo si aborta un hilo: si estaba escribiendo en un archivo, entonces el archivo probablemente esté corrupto, etc.

2

El concepto de fondo frente a fondo puede ser un poco confuso. Como otros han señalado, el aspecto de fondo solo afecta si el tiempo de ejecución cerrará el proceso o no. Si no quedan subprocesos en primer plano, se cerrará el proceso independientemente del número de subprocesos de fondo en ejecución una vez que termina el último subproceso en primer plano.

En cuanto a los nuevos hilos que se ejecutan "en el fondo del hilo principal", no es realmente el caso. Cada nuevo hilo tendrá la misma prioridad que el hilo principal, por lo que se programarán con la misma frecuencia que el hilo principal y, por lo tanto, el hilo principal no recibirá ningún tratamiento especial en ese sentido. Los hilos se programan en función de la prioridad y no de si son hilos de primer plano o de fondo.

Puede, por supuesto, establecer tanto el fondo/primer plano como la prioridad de los nuevos hilos, pero el valor predeterminado es que los nuevos hilos son iguales al hilo inicial.