2012-01-04 16 views
9

Dlaczego wątek, który utworzył kontrolkę, jest tym, który może go zaktualizować? Dlaczego MS nie dał ludziom możliwości używania technik blokowania i innych technik synchronizacji wątków do odczytu i zapisu do właściwości kontrolek interfejsu z wieloma wątkami.Dlaczego kontrolki interfejsu użytkownika w WPF mają powinowactwo do wątku?

+2

Odpowiedź MS na msdn "W końcu model wątkowania WPF był zsynchronizowany z istniejącym modelem wątków User32 z pojedynczym przetwarzaniem wątków z powinowactwem wątku. Głównym powodem tego była interoperacyjność - systemy takie jak OLE 2.0, schowek i Wszystkie przeglądarki Internet Explorer wymagają wykonywania powinowactwa do pojedynczego wątku (STA). " – Andy

Odpowiedz

11

Krótki opis za MSDN jest

modelu gwintowania WPF był zsynchronizowany z istniejącym User32 gwintowej modelu pojedynczego wykonania gwintowany z gwintem powinowactwem. Głównym powodem było to interoperacyjność - systemy takie jak OLE 2.0, schowku i Internet Explorer wszystkie wymagają pojedynczy wątek powinowactwo (STA) wykonanie

Dłuższy opis jest taki:

Większość obiekty w WPF pochodzą z DispatcherObject, który zapewnia podstawowe konstrukcje do obsługi współbieżności i wątków. WPF to w oparciu o system przesyłania komunikatów zaimplementowany przez dyspozytora. Działa to bardzo podobnie do znanej pompy komunikatów Win32; w rzeczywistości, dyspozytor WPF wykorzystuje wiadomości User32 do wykonywania połączeń z wątkami krzyżowymi.

Istnieją naprawdę dwie podstawowe pojęcia, które należy zrozumieć, omawiając współbieżność w WPF - powinowactwo dyspozytora i wątku.

Podczas fazy projektowania WPF celem było przejście do pojedynczego wątku wykonawczego o numerze , ale niezwiązanego z wątkiem modelu "powiązanego". Wątek Kolejność występuje, gdy komponent używa tożsamości wykonującego wątku do przechowywania pewnego rodzaju stanu. Najpopularniejszą formą tego jest używanie magazynu lokalnego wątku (TLS) do przechowywania stanu. Powinowactwo gwintu wymaga, aby każdy wątek logiczny wykonania był własnością tylko jednego fizycznego wątku w systemie operacyjnym, który może stać się intensywnie pamięcią . Ostatecznie model wątkowania WPF był zsynchronizowany z istniejącym modelem wątków User32 o pojedynczym wątku z powinowactwem wątku . Główną przyczyną takiego stanu rzeczy była interoperacyjność - systemy takie jak OLE 2.0, schowek i Internet Explorer wymagają wykonania pojedynczego wątku (STA) w postaci pojedynczej nitki ( ).

Zakładając, że masz obiekty z gwintowaniem STA, potrzebujesz sposobu na komunikację między wątkami i sprawdzenia poprawności wątku . Na tym polega rola dyspozytora. Dyspozytor to podstawowy system wysyłania komunikatów o wielu priorytetach. Przykłady wiadomości zawierają nieprzetworzone powiadomienia wejściowe (przesunięte myszą), funkcje strukturalne (układ) lub komendy użytkownika (wykonaj tę metodę). Wychodząc z obiektu DispatcherObject, tworzysz obiekt CLR, który ma zachowanie STA i otrzyma wskaźnik do programu rozsyłającego w momencie utworzenia .

można przeczytać cały artykuł here

osobiście wolę jednowątkowego modelu WPF nad konieczności użycia technik blokowania i synchronizacji wątków.Za pomocą Dispatcher można przekazywać wiadomości do głównego wątku UI pod numerem different priority levels, który zajmuje się większością małych procesów w tle, a jeśli potrzebujesz ciężkiego przetwarzania, nadal możesz utworzyć dla niego własny wątek tła.

3

WPF, podobnie jak wszystkie zestawy narzędzi UI, działa poprzez pompowanie pętli wiadomości. Ponieważ wiadomości mogą przychodzić w dowolnym momencie i wpływać na dowolną kontrolę, potrzebna jest globalna blokada. Aby zmniejszyć ryzyko błędów, prawdopodobnie potrzebujesz funkcji, która wywołałaby delegata pod blokadą. Może coś takiego:

Dispatcher.Invoke(Delegate, Object()) 

Fakt ten zostaje zgromadzona w wątku UI zamiast nabywania globalnej blokady jest tylko szczegółów wdrażania.

+2

Tak naprawdę krótka odpowiedź jest taka, że ​​WPF jest zbudowany na starych, sprytnych materiałach z błyszczącym przyjaznym interfejsem dla programistów. Stąd model STA. – Andy

+0

+1. Marketing obalony! –

Powiązane problemy