2010-03-31 1 views
23

No powiedzmy, że mam obiekt, który ja databind do implementuje INotifyPropertyChanged powiedzieć GUI, gdy wartość zmieniła ...WPF Bezpieczeństwo gwintowania danych?

jeśli wywoła to z innego wątku niż wątku GUI w jaki sposób zachowują się WPF?

i czy upewni się, że pobiera wartość właściwości z pamięci, a nie z pamięci podręcznej procesora?

mniej lub bardziej im pytaniem czy WPF ma blokadę() na obiekcie zawierającego właściwość ...

Odpowiedz

38

Zmiany wartości wywołane przez INotifyPropertyChangedzostają automatycznie skierowane na numer z powrotem do dyspozytora. (http://blog.lab49.com/archives/1166)

Ogień to wydarzenie na każdym wątku chcesz ... zmiany


Wartość wystrzelone przez INotifyCollectionChangedNIE są niezawodnie marshalled na dyspozytora. (http://csharplive.wordpress.com/2008/09/11/wpf-data-binding-observablecollection-cross-thread-binding-support/)

Jeśli trzeba zaktualizować zaobserwowania kolekcji z innego wątku, postępuj zgodnie ze wskazówkami w ten link

+0

+1 Ha! Każdego dnia ucz się czegoś nowego. Po prostu zrobiłem szybki test, aby to potwierdzić ... Jestem pewien, że musiałem przekazać wartości do wątku UI podczas pracy z wpf ... może po prostu będę starczy ... – ozczecho

+1

Z pewnością musisz zebrać wszystkie połączenia z rzeczywistym control ('textBox.Text =" Foo ")', ale struktura danych pomaga trochę. –

+0

Co się stanie, jeśli napiszę wartość do zmiennej prywatnej używanej przez właściwość, a następnie uruchomię zdarzenie, a następnie wątek "GUI" zacznie czytać wartość, ale ma starą wartość zapisaną w pamięci podręcznej procesora ... czy jest tam jakikolwiek handeling tego, który upewnia się, że wartość nie jest stara lub buforowana? ... – Peter

0

W praktyce wydaje się działać zgodnie z oczekiwaniami i wydaje się być bezpieczny wątku (nie widać niczego dziwny zdarzają się lub wyjątki w wyniku aktualizacji wątku w tle). Wierzę, że w razie potrzeby odwołuje się do wątku interfejsu użytkownika, ale nie jestem zbyt zaznajomiony z elementami wewnętrznymi.

2

oprócz @Rob odpowiedź Fonseca-Ensor, nie istnieje jakaś dobra wiadomość dla tych, szczęście użyj WPF4.5:

WPF umożliwia dostęp i modyfikowanie kolekcji danych w wątkach innych niż ten, który utworzył kolekcję. Umożliwia to użycie wątku podstawowego w celu odbierania danych z zewnętrznego źródła, takiego jak baza danych, i wyświetlania danych w wątku interfejsu użytkownika. Używając innego wątku do modyfikacji kolekcji, interfejs użytkownika pozostaje responsywny w stosunku do interakcji użytkownika. (https://msdn.microsoft.com/en-us/library/bb613588(v=vs.110).aspx#xthread_access)

Jest to pomocne podsumowanie Jonathan Antoine: http://www.jonathanantoine.com/2011/09/24/wpf-4-5-part-7-accessing-collections-on-non-ui-threads/