2011-05-30 24 views
5

Tengo un objeto ListBox en mi hilo principal (aplicación WPF). ¿Por qué no puedo acceder a él en el hilo de BackgroundWorker? Hasta donde yo sé, la pila está separada para cada hilo, pero el montón es común. No es objeto ListBox creado en heap. En ese caso, ¿por qué no es accesible? Intenté pasar el parámetro de referencia ListBox como parámetro e intenté acceder a sus contenidos en BackgroundWorker. ¿El concepto de compartir objetos entre hilos es diferente de C++?Compartir objetos entre un BackgroundWorker y el hilo principal

+0

¿Puedes mostrar algún fragmento de código? – crypted

+1

Puede pasarlo como cualquier otro objeto pero tan pronto como lo cambie se generará una excepción ya que el modelo de subprocesamiento es 'STA'. Puede encontrar cómo cambiarlo de manera segura desde diferentes subprocesos en 'stackoverflow'. – Xaqron

Respuesta

10

Al igual que WinForms, el diseño de WPF se simplifica enormemente por el requisito de que se acceda a todos los elementos de la interfaz de usuario solo desde los hilos que los crearon.

Cuando intenta escribir un programa de subprocesos múltiples, esta "característica" puede parecer una gran limitación. Es imposible modificar incluso las propiedades más simples de un elemento de interfaz de usuario directamente desde una cadena de fondo. Si es así, ¿cómo podemos usar hilos de fondo con WPF?

La respuesta es que debemos transformar nuestras acciones destinadas a la interfaz de usuario en la línea de fondo donde el trabajo se puede realizar sin conflicto. Más estrictamente hablando, debemos hacer que nuestras acciones se ejecuten en el contexto del hilo que creó el elemento que estamos tratando de modificar.

El tema de la rosca en WPF es uno grande, pero aquí es un excelente artículo de introducción:

Si usted lee este artículo que ver cómo utilizar el Dispatcher para lograr su acciones sin violar el modelo de subprocesamiento.

Cuestiones relacionadas