Pregunta simple, para repetir el título:¿El cierre de la aplicación detiene todos los BackgroundWorkers activos?
¿Al cerrar la aplicación WinForms se detienen todos los BackgroundWorkers activos?
Pregunta simple, para repetir el título:¿El cierre de la aplicación detiene todos los BackgroundWorkers activos?
¿Al cerrar la aplicación WinForms se detienen todos los BackgroundWorkers activos?
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:
"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.
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
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.
Creo que sí. Porque los hilos están asociados con el proceso y si el proceso está cerrado, todos los hilos tienen que terminar.
hilos BackgroundWorker son hilos de fondo (threads), ThreadPoolwhich die when the application dies.
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.
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.
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);
}
}
}
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. –