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?
Odpowiedz
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.
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.
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
+1. Marketing obalony! –
- 1. Jak przekazać bitmapimage z wątku tła do wątku interfejsu użytkownika w WPF?
- 2. Uzyskaj nazwę kontrolki użytkownika nadrzędnego WPF C#
- 3. Użyj programu obsługi do publikowania w wątku interfejsu użytkownika
- 4. Dlaczego zawsze należy tworzyć/aktualizować elementy interfejsu użytkownika z wątku interfejsu użytkownika?
- 5. android - wywoływanie wątku interfejsu użytkownika z wątku roboczego
- 6. Uzyskiwanie dostępu do GoogleMap spoza wątku interfejsu użytkownika w Androidzie
- 7. Zakleszczenie podczas wywoływania wątku interfejsu użytkownika z wątku roboczego
- 8. Uzyskiwanie dostępu do kontroli interfejsu użytkownika z wątku BackgroundWorker
- 9. W WPF jest bezpieczny wątek metody dispatcher.begininvoke interfejsu użytkownika?
- 10. Zadanie ContinueWith() Nie aktualizowanie kursora przy użyciu wątku interfejsu użytkownika
- 11. Biblioteka animacji interfejsu użytkownika programu WPF
- 12. WPF Synchroniczna animacja i zakleszczenie gwintu interfejsu użytkownika
- 13. Czy można zapytać DownloadManager w wątku interfejsu użytkownika?
- 14. WPF Pobierz wątek interfejsu użytkownika lub sposób wyświetlania okna z wątku NON-UI
- 15. WPF: Wstrzymywanie właściwości innej kontrolki w wyzwalaczu kontrolki
- 16. Zapobieganie zamarzaniu podczas odbudowy złożonego interfejsu użytkownika WPF?
- 17. Jak tworzyć elementy interfejsu użytkownika leniwie w WPF?
- 18. jak ustawić powinowactwo procesora do określonego pthread?
- 19. Jak ukryć część kontrolki WPF?
- 20. Dlaczego nie mogę uzyskać płynnej 60 animacji FPS w aplikacji WPF podczas uruchamiania kontrolki w wątku tła w systemie Windows 10?
- 21. Jak kontynuować po wielu zadaniach bez blokowania wątku interfejsu użytkownika?
- 22. Jak wywołać metodę w wątku interfejsu użytkownika z poziomu wątku roboczego?
- 23. Jak szybko wyrównać kontrolki w oknie WPF?
- 24. Tworzenie projektanta interfejsu użytkownika
- 25. Aktualizowanie interfejsu użytkownika przy użyciu usługi BackgroundWorker w pakiecie WPF
- 26. Samouczek WPF do tworzenia niestandardowej kontroli użytkownika
- 27. Zapobiegaj blokowaniu interfejsu użytkownika bez dodatkowych wątków.
- 28. Jak uniknąć blokowania przez AdMob wątku interfejsu użytkownika
- 29. Jak uzyskać wartość obrotu elementu interfejsu użytkownika w WPF
- 30. Jak przekazać wskaźnik interfejsu do wątku?
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