2010-03-31 9 views
23

Bene Diciamo che ho un oggetto che ho DataBind a, implementa INotifyPropertyChanged a dire la GUI quando un valore è cambiato ...WPF Sicurezza thread threading?

se attivare questo da un thread diverso da quello del filo GUI come sarebbe WPF si comportano?

e si assicura che ottenga il valore della proprietà dalla memoria e non dalla cache della CPU?

più o meno im chiedendo se WPF fa blocco() sull'oggetto che contiene la proprietà ...

risposta

38

Le modifiche di valore attivate da INotifyPropertyChangedvengono automaticamente rimandate al dispatcher. (http://blog.lab49.com/archives/1166)

fuoco questo evento su qualsiasi thread che ti piace ... cambiamenti


valore sparati da INotifyCollectionChangedNON sono schierò in modo affidabile sul dispatcher. (http://csharplive.wordpress.com/2008/09/11/wpf-data-binding-observablecollection-cross-thread-binding-support/)

Se è necessario aggiornare una raccolta osservabile da un thread diverso, seguire i consigli in questo link

+0

+1 Ha! Impara una cosa nuova ogni giorno. Ho appena fatto un test rapido per confermare questo .... Sono sicuro che ho dovuto eseguire il marshalling dei valori nell'interfaccia utente quando lavoro con wpf ... forse sto solo andando senile ... – ozczecho

+1

Devi certamente effettuare il marshalling di tutte le chiamate contro un effettivo control ('textBox.Text =" Foo ")', ma il framework di databinding aiuta un po '. –

+0

Cosa succede se scrivo un valore nella variabile privata che la proprietà utilizza e quindi attiva l'evento, quindi il thread "GUI" va in giro per leggere il valore, ma ha un vecchio valore memorizzato nella cache della CPU ... è lì qualsiasi manipolazione di ciò che si assicura che il valore non sia vecchio o memorizzato nella cache? ... – Peter

0

In pratica sembra funzionare come previsto e sembra essere thread-safe (non hanno visto nulla di strano accadere o eccezioni a seguito dell'aggiornamento sul thread in background). Credo che invochi il thread dell'interfaccia utente quando necessario, ma non ho molta familiarità con gli interni.

2

Oltre a @ Rob risposta di Fonseca-Ensor, c'è una buona notizia per chi ha la fortuna di utilizzare WPF4.5:

WPF consente di accedere e modificare raccolte di dati su thread diversi da quello che ha creato la raccolta. Ciò consente di utilizzare un thread in background per ricevere dati da un'origine esterna, ad esempio un database, e visualizzare i dati sul thread dell'interfaccia utente. Usando un altro thread per modificare la raccolta, l'interfaccia utente rimane reattiva all'interazione dell'utente. (https://msdn.microsoft.com/en-us/library/bb613588(v=vs.110).aspx#xthread_access)

C'è una sintesi utili dai Jonathan Antoine: http://www.jonathanantoine.com/2011/09/24/wpf-4-5-part-7-accessing-collections-on-non-ui-threads/