2010-02-13 8 views
5

Aprendiendo a construir aplicaciones WTF de subprocesos múltiples Leí sobre algunas restricciones al usar BackgroundWorker que no estaba muy claro para mí. Por favor, ayúdame a entender:¿El BackgroundWorker brinda subprocesos reales?

Si no quiero solo un hilo trabajando detrás de la escena de la interfaz de usuario, pero quizás varios, comenzando y terminando uno independientemente del otro, ¿funcionará el BackgroundWorker en tal caso? ¿Puedo tener varias instancias del BackgroundWorker?

En pocas palabras, ¿proporciona el BackgroundWorker un multihilo y no solo un subprocesamiento?

+0

¿Tiene un enlace a las restricciones sobre las que leyó? –

+0

@ Marcos Byers Por ejemplo este párrafo (de "Pro WPF en C# 2008" libro de Matthew MacDonald): "Nota: El BackgroundWorker es perfecto si usted tiene una sola tarea asíncrona que se ejecuta en segundo plano desde el principio hasta el final (con la opción apoyo a los informes de progreso y cancelación). Si tiene algo más en mente, por ejemplo, una tarea asíncrona que corre a lo largo de toda la vida de su aplicación o una tarea asíncrona que se comunica con su aplicación mientras se realiza su trabajo, usted necesitará diseñar una solución personalizada utilizando el soporte de subprocesamiento de .NET. " – rem

+1

creo que es más una cuestión de lo que se considera un buen diseño que de lo que es técnicamente posible. * Puedes * crear muchos Trabajadores de fondo, pero puede que no sea la mejor manera de resolver tu problema. –

Respuesta

11

Cada BackgroundWorker se ejecuta en una secuencia separada. Puede crear tantos trabajadores de fondo como sea necesario para ejecutar operaciones en paralelo, por lo que en ese sentido es verdadero multihilo.

El beneficio de BackgroundWorker es la facilidad con la que puede suscribirse eventos que se activarán en su subproceso de interfaz de usuario cuando se complete la tarea que consume tiempo.

Usando BackgroundWorker es muy simple:

var worker1 = new System.ComponentModel.BackgroundWorker(); 
worker1.DoWork += (sender,e) => Thread.Sleep(10000); 
worker1.RunWorkerCompleted += (sender,e) => MessageBox.Show("Worker1 Finished!"); 
worker1.RunWorkerAsync(); 
2

Si crea muchos casos BackgroundWorker entonces obtendrá muchos hilos, una única instancia prevé una única tarea en segundo plano sin embargo.

3

Las restricciones que cita (de Pro WPF) provienen del hecho de que un BGW usa el ThreadPool, por lo que todos rules and adivice con respecto a los subprocesos de ThreadPool se aplican.

+0

Gracias por una información útil y enlace +1 – rem

0

Sí, internamente, el trabajador de fondo llama a BeginInvoke cuando se le proporciona un delegado. Esto dará lugar a que su delegado se coloque en un grupo de subprocesos en el CLR.

Cuestiones relacionadas