Multithreading WPF nel Binding

Devo segnalarvi un errore nello script #17 dove spiego come implementare INotifyPropertyChanged. Di sbagliato c'è la frase in cui dicevo che è obbligatorio invocare l'evento tramite il Dispatcher, quindi sul thread principale, e mostravo come chiamare la BeginInvoke.

In realtà il motore di Binding sull'evento PropertyChanged internamente controlla già se il thread corrente è quello principale. In caso contrario accoda l'evento sul Dispatcher con priorità DataBind. Quindi quello che proponevo non era sbagliato, ma inutile, risparmiando solo del lavoro al motore di Binding.

C'è da dire comunque che non è dato sapere chi utilizza le nostre proprietà, ma non è altrettanto bello mettere della logica specifica di WPF nelle classi (infatti non lo proponevo per il Domain Model). Va comunque fatta attenzione che solo l'oggetto Binding gestisce questo aspetto. Per esempio le CollectionView che lavorano sulle collezioni, s'arrabbiano generando un'eccezione se modichiamo le liste da altri thread. Possiamo però aggirare il problema invocando PropertyChanged e CollectionChanged sul thread principale affidandoci al Dispatcher. Se usate ObservableCollection<T>, vi basta sovrascrivere OnPropertyChanged e OnCollectionChanged.

Mi scuso per la mala informazione...

Nella stessa categoria

Commenti

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.

© 1998-2008 - Ricciolo.NET - Il blog di Cristian "Ricciolo" Civera

TagCloud
BLOG INFO
  • Post: 173
  • Commenti: 74
  • TrackBacks: 37
  • Feed blog e contenuti tecnici: RSS
  • Feed blog: RSS Atom OPML

MVP
CATEGORIE
I PIÙ LETTI DEL MESE
IN EVIDENZA