2010-09-04 8 views
6

En WPF tenemos dos hilos (al menos): representación y un hilo de interfaz de usuario. Cuando planteo un evento OnNotifyPropertyChanged en algunos cambios de propiedad, se genera en el hilo de UI. Esta información debe enviarse a la secuencia de representación de WPF para volver a representarla. Supongo que se realiza de forma sincronizada (Dispatcher.Invoke) pero, ¿cómo funciona realmente?INotifyPropertyChanged: ¿qué ocurre detrás de la escena?

Si levanto múltiples eventos OnNotifyPropertyChanged de la misma estructura de datos sin bloquear el acceso a la propiedad de acceso para esta estructura de datos para la que se han planteado estos eventos, estoy creando una condición de carrera potencial? He visto la infame excepción "La colección se modificó; la operación de enumeración no se puede ejecutar" procedente de WPF, por lo que parece que WPF procesa estos eventos de forma asincrónica. ¿Estoy entendiendo mal la excepción? ¡Gracias!

+0

¿Por qué no publicas una muestra para recrear esto? Como mostrar un par de colecciones que cambias frecuentemente de algún evento DispatcherTimer. –

Respuesta

0

esperanza cuando se está refiriendo dos hilos, usted se refiere

  1. representación hilo
  2. interfaz de usuario de rosca.

Si usted tiene razón la actualización es una Asynch

Tome un vistazo a http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

+0

Guru, ¿dónde dice que WPF procesa el evento NotifyPropertyChanged de forma asíncrona? – Lenik

1

La excepción "Colección se modificó, la operación de enumeración no puede ejecutar" no está relacionado con WPF, que se eleva de IEnumerator cuando iteraba en una colección con foreach y mientras hacía eso, la colección se cambiaba de alguna manera (agregar/eliminar/modificar). (por ejemplo: http://social.msdn.microsoft.com/forums/en/netfxbcl/thread/7ce02724-2813-4f7d-8f3c-b1e3c1fd3019/) .

Aparte de eso, nunca he encontrado una excepción causada por múltiples invocaciones simultáneas en evento PropertyChanged.

+0

el punto es que la colección es iterada por WPF y no por mi código. Cuando activo las excepciones de primera oportunidad, veo que falla en .NET – Lenik

+0

¿Qué hilo es la excepción lanzada? –

+0

Mi mejor suposición es que está sucediendo porque modificas la colección durante la carga del xaml. El enlace intenta iterar en la colección para rellenarlo en su ItemsControl y, al mismo tiempo, lo está modificando. Intenta sincronizarlo. – Captain

0

¿Está procesando usted mismo en el hilo que no es UI? Estoy bastante seguro de que la iteración de las enumeraciones a las que se está vinculando se realizará en el subproceso de UI, por lo que si después de plantear el evento, alguien más en su aplicación modifica la colección, obtendría esta excepción.

El problema no debe estar causado por el hilo de representación que itera sobre su colección, ya que nunca lo hace.

Cuestiones relacionadas