2012-02-12 28 views
5

Actualmente estoy lidiando con hilos y esperando que alguien pueda explicar claramente cómo resolver el siguiente error.Acceso a elementos de diccionario instanciados en hilos secundarios

Tengo un global Dictionary<string, BitmapImage> dic que instancia en el hilo principal.

El hilo principal crea un hilo hijo para llenar el diccionario con imágenes.

El hilo principal y luego intenta acceder al diccionario y produce una excepción

The calling thread cannot access this object because a different thread owns it

No tengo problemas con el acceso a diccionario en sí, por ejemplo, dic.ContainsKey("key") funciona bien, es solo cuando trato de acceder a BitmapImage en el diccionario que se produce el error.

Supongo que es porque las imágenes de mapa de bits almacenadas en el diccionario se instancian en el hilo secundario y esto está causando un problema, ¿alguna idea de cómo puedo evitar esto?

He visto un montón de tutoriales de subprocesos y consejos aquí, pero parece que en todas partes le dice cómo acceder a un objeto de subproceso principal desde un subproceso mientras que estoy tratando de hacer lo contrario.

Gracias.

+0

publica tu código de (reducción, pero muestra el comportamiento) –

Respuesta

8

En general, solo puede acceder a los elementos de la interfaz de usuario desde el hilo en el que se crearon. Lo que significa que debe asegurarse de que el hilo principal esté creando objetos BitmapImage por sí mismo.

Sin embargo, en este caso, puede utilizar el hecho de que BitmapImage se puede utilizar desde diferentes subprocesos después de que se hayan congelado (con el método Freeze()). Por lo tanto, puede intentar crear imágenes en subprocesos secundarios, congelarlos y luego agregarlos a su diccionario (asegúrese de hacerlo de manera segura, por ejemplo, bloqueando algún objeto mutex antes de acceder al diccionario).

Más información se puede encontrar en el sitio Freezeable Objects Overview.

+0

No puedo creer que haya sido tan simple: 4 horas de golpear mi cabeza contra la pared y recibo la respuesta en menos de 10 minutos, gracias Ravadre! !! – Gavimoss

+0

@Gavimoss Tu bienvenida :-), lo curioso es que ayer descubrí este método. –

Cuestiones relacionadas