2010-03-31 10 views
23

Bueno Digamos que tengo un objeto que i databind a, implementa INotifyPropertyChanged para contar la interfaz gráfica de usuario cuando un valor ha cambiado ...WPF ¿Seguridad de hilo de enlace de datos?

si desencadenar este de un hilo diferente que el hilo GUI cómo se comportan WPF?

y se asegurará de que obtiene el valor de la propiedad de la memoria y no de la memoria caché de la CPU?

im más o menos preguntando si WPF hace bloqueo() en el objeto que contiene la propiedad ...

Respuesta

38

Los cambios de valores disparados por INotifyPropertyChangedse agrupan automáticamente en en el despachador. (http://blog.lab49.com/archives/1166)

fuego este evento en cualquier tema que te gusta ... cambios


Valor disparados por INotifyCollectionChangedNO están marshalled fiable al despachador. (http://csharplive.wordpress.com/2008/09/11/wpf-data-binding-observablecollection-cross-thread-binding-support/)

Si necesita actualizar una colección observable desde un subproceso diferente, siga los consejos de este enlace

+0

1 Ja! Aprende algo nuevo todos los días Acabo de hacer una prueba rápida para confirmar esto ... Estoy seguro de que tuve que asignar valores al hilo de la interfaz de usuario al trabajar con wpf ... tal vez solo me estoy volviendo senil ... – ozczecho

+1

Sin duda tiene que reunir las llamadas en contra de un real control ('textBox.Text =" Foo ")', pero el marco de enlace de datos ayuda un poco. –

+0

¿Qué pasa si escribo un valor a la variable privada que utiliza la propiedad y luego desencadenar el evento, entonces el hilo "GUI" va a leer el valor, pero tiene un valor antiguo en caché en la memoria caché de la CPU ... hay ¿Alguna manipulación de esto que asegure que el valor no sea antiguo o guardado en la memoria caché? ... – Peter

0

En la práctica parece que funciona como se esperaba y parece ser seguro para subprocesos (no han visto nada extraño suceder o excepciones como resultado de la actualización en el hilo de fondo). Creo que invoca el hilo de interfaz de usuario cuando es necesario, pero no estoy muy familiarizado con las partes internas.

2

Además de @ Rob respuesta de Fonseca-Ensor, hay algunas buenas noticias para los afortunados que use WPF4.5:

WPF le permite acceder y modificar colecciones de datos en hilos que no sean el que creó la colección. Esto le permite usar un hilo de fondo para recibir datos de una fuente externa, como una base de datos, y mostrar los datos en el hilo de la interfaz de usuario. Al usar otro hilo para modificar la colección, su interfaz de usuario sigue siendo receptiva a la interacción del usuario. (https://msdn.microsoft.com/en-us/library/bb613588(v=vs.110).aspx#xthread_access)

Hay un resumen útil de Jonathan Antoine: http://www.jonathanantoine.com/2011/09/24/wpf-4-5-part-7-accessing-collections-on-non-ui-threads/