2011-01-21 35 views
9

¿Cuál es la diferencia entre BackgroundWorker y Thread? En mi aplicación, estoy usando un sistema de mensajería que se comunica con la base de datos regularmente. ¿Cuál querría usar aquí: BackgroundWorker o Thread?Diferencia entre BackgroundWorker y Thread?

Respuesta

19

A BackgroundWorker es una clase lista para usar en WinForms que le permite ejecutar tareas en hilos de fondo que evita la congelación de la interfaz de usuario y además permite calcular fácilmente la ejecución de la devolución de llamada exitosa en el hilo principal que le da la posibilidad de actualizar la interfaz de usuario con los resultados. También da la posibilidad de seguir el progreso y cancelar la tarea. Utiliza subprocesos del grupo de subprocesos.

Por otro lado, Thread es una clase que le permite simplemente ejecutar alguna tarea en un nuevo thread. Es un concepto mucho más básico.

1

BackgroundWorker ya ha implementado la funcionalidad del informe de progreso, finalización y cancelación, por lo que no necesita implementarlo usted mismo. El uso del subproceso le da más control sobre la ejecución del proceso asíncrono (por ejemplo, prioridad de subprocesos o elegir entre el tipo de subproceso en primer plano/fondo).

A veces no necesita informes de progreso y otras cosas de BackgroundWorker, por lo que Thread/ThreadPool será una buena alternativa.

1

El BackgroundWorker utiliza subprocesos del ThreadPool, con Thread crea su propio hilo. Además, hay cierta facilidad en el término del evento que informa al hilo de llamada.

+0

+1 por mencionar ThreadPool – spender

1

Un BackgroundWorker es una implementación de subprocesos que le permite asignar asignar un método para que se realice.

Le proporciona una API de comunicación que le permite detener el trabajo, realizar un seguimiento del progreso y recibir notificaciones de forma asincrónica.

1

Use BackgroundWorker - de todos modos encapsula el hilo y es más fácil de trabajar. Una de las ventajas es que su api permite un modelo más simple basado en eventos para informar el progreso y, además, esas llamadas a eventos se enrutan correctamente al hilo de UI (para que no tenga que ordenar la llamada usando el método Invoke).

7

Si bien el BackgroundWorker class no se deriva de la clase Thread, le permite administrar el trabajo de un hilo de una manera mucho más fácil que si lo hubiera creado e invocado el hilo usted mismo.

Plantea tres eventos principales:

  • DoWork - levantado cuando el hilo se inicia.
  • ProgressChanged - levantado para informar el progreso del hilo de la IU principal.
  • RunWorkerCompleted - se levanta cuando termina el hilo.

Con estos puede controlar el trabajo que está haciendo el hilo después de llamar al RunWorkerAsync() para iniciarlo.

+0

BackgroundWorker encapsulates a Thread? ¿De qué estás hablando? Hay un delegado encapsulado, que se invoca asíncronamente. –

+0

@lazyberezosky - tienes razón. Usé el término equivocado. Actualizaré la respuesta. – ChrisF

0

Creo que hay una gran diferencia, es decir, cuando desea utilizar cualquier componente de la interfaz de usuario en los métodos llamados por BackgroundWorker, no funciona en absoluto. Me refiero a que BackgroundWorker es realmente un proceso en segundo plano y no podrás usar acciones de interfaz.Por ejemplo, si creas una nueva etiqueta en el método que va a llamar por parte de BackgroundWorker, definitivamente capturas un error.

Cuestiones relacionadas