2010-11-18 8 views
9

Tengo una aplicación GUI que necesita ejecutar cálculos largos (piense un minuto o más) y la forma en que trata esto es dando el cálculo a un trabajador de segundo plano. (Esta parte está muy bien)¿Qué hilo ejecuta backgroundworker en el controlador de eventos ejecutado?

La pregunta que tengo es si hago algo como: this.backgroundWorker.RunWorkerCompleted + = new System.ComponentModel.RunWorkerCompletedEventHandler (this.doSomethingElse);

se doSomethingElse va a ejecutar en el subproceso de interfaz de usuario principal o lo que sea en el grupo de subprocesos del trabajador fondo corrió en?

gracias por cualquier ayuda que pueda proporcionar.

+1

Se puede escribir el 'System.Threading.Thread.CurrentThread.ManagedThreadId' a la ventana de salida en el' UI', '' DoWork' y WorkCompleted' confirmar – PostMan

Respuesta

6

que va a ser ejecutado en el mismo hilo que BackgroundWorker está en, es decir, lo más generalmente el hilo de interfaz de usuario.

+0

Ok para la segunda parte, pero un Bgw (o cualquier otro objeto) no está 'en un hilo'. –

+1

Lo sentimos, el hilo que dio lugar a que hubiera sido una mejor redacción – Homde

+0

Esto nos lleva a un punto interesante en realidad .. si se utiliza el diseñador de interfaz gráfica de usuario visual en una aplicación Windows Forms para declarar una BackgroundWorker, termina el objeto BackgroundWorker real hasta en el apilar para el hilo de UI o en el montón? –

5

es doSomethingElse va a ejecutar en el hilo principal interfaz de usuario

Sí, esa es la principal razón de ser de un BackgroundWorker. Tiene 3 eventos, solo DoWork se ejecutará en un hilo separado (ThreadPool). Completed y ProgressChanged se calcularán en el hilo 'principal'.

4

Si el BackgroundWorker fue creado desde el hilo de interfaz de usuario, entonces el evento RunWorkerCompleted también se planteará en el subproceso de interfaz de usuario.

Si se crea a partir de un subproceso de fondo, el evento serán levantados en un subproceso en segundo plano no definido.

Ver este post y este problema de conexión para más información.

https://stackoverflow.com/a/2806824/279999

http://connect.microsoft.com/VisualStudio/feedback/details/116930/backgroundworker-components-progresschanged-and-runworkercompleted-event-run-on-wrong-thread

+0

¡De hecho! La primera vez que confundí este hecho cuando mi aplicación funcionaba bien, y el evento Completed se invocó desde el hilo principal de la interfaz de usuario. Pero mis pruebas de unidad fallaron en cuanto al evento Completado se invocó desde el hilo de fondo, no desde el hilo de prueba principal –

Cuestiones relacionadas