2009-11-06 12 views

Respuesta

18

Sí, lo hace.

BackgroundWorker.RunWorkerAsync simplemente llama a BeginInvoke en un delegado interno, que a su vez pone en cola la solicitud al ThreadPool. Dado que todos los hilos ThreadPool son background, sí, finalizará cuando finalice la aplicación.

Sin embargo, tenga en cuenta que:

  1. "cerrando la aplicación de Windows Forms" Estoy suponiendo el cierre de la instancia principal Form (que es generalmente el pasado a Application.Run en la clase Program autogenerado por Visual Estudio). Si tiene una ventana secundaria con un trabajador en segundo plano, no detendrá su BackgroundWorker automáticamente.

  2. Dejar que un subproceso de fondo se abortará la salida aplicación es no la forma recomendada para terminar el hilo, ya que tienes no hay garantías donde será abortado. Una forma mucho mejor sería señalar al trabajador antes de cerrar, esperar a que termine con elegancia y luego salir.

Más información: Delegate.BeginInvoke, MSDN on Thread Pooling, Thread.IsBackground

0

Si la aplicación se cierra por completo (ya que en nada impide que se cierre), sus trabajadores de fondo también se irán.

+3

Esa es una especie de respuesta circular. Si los trabajadores en segundo plano no se detienen automáticamente cuando se cierra la aplicación, evitarán que se cierre la aplicación. –

-1

Creo que sí. Porque los hilos están asociados con el proceso y si el proceso está cerrado, todos los hilos tienen que terminar.

0

Una vez que el proceso desaparece, todos los hilos asociados desaparecen.

+0

Excepto si su propiedad 'IsBackground' está establecida en' false'. – Groo

+0

Lo que evitaría que el proceso termine. Entonces la respuesta es válida;) – dkackman

7

La única forma en que un hilo puede seguir ejecutándose después de que se detuvo el hilo principal (UI) es si se ha creado explícitamente, creando una nueva instancia Thread y estableciendo IsBackground en falso. Si no lo hace (o si usa el ThreadPool que engendra hilos de fondo - o el BackgroundWorker que también usa ThreadPool internamente) su hilo será un hilo de fondo y terminará cuando termine el hilo principal.

0

En primer lugar, sólo para hacer que esta respuesta sencilla:

Cuando un proceso se ha cerrado, todos los subprocesos han terminado. No hay dudas sobre esto.

La pregunta, como yo lo interpreto, por lo tanto se convierte en:

seguirá siendo de marcha BackgroundWorker casos impiden que una aplicación se cierre?

La respuesta a que pregunta es: No, no lo harán.

1

Sí, lo hará. Escribí este formulario simple y cerrando el formulario sale de la aplicación:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     this.backgroundWorker1.RunWorkerAsync(); 
    } 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     while (true) 
     { 
      Thread.Sleep(100); 
     } 
    } 
} 
Cuestiones relacionadas