爲什麼創建控件的線程是可以更新它的線程?爲什麼沒有MS讓人們能夠使用鎖定和其他線程同步技術讀取和寫入具有多個線程的UI控件的屬性。爲什麼WPF中的UI控件具有線程親和性?
回答
每MSDN簡短說明是
WPF的線程模型被保持同步單線程執行的現有USER32 線程模式與線程關聯。這樣做的 主要原因是互操作性 - 像OLE 2.0, 剪貼板和Internet Explorer的系統都需要單獨的線程 親和力(STA)執行
較長的描述是這樣的:
最WPF中的對象派生自DispatcherObject,它提供了用於處理併發和線程的 基本構造。 WPF是 基於由調度程序實現的消息系統。這個工程 很像熟悉的Win32消息泵;實際上,WPF調度程序 使用User32消息來執行跨線程調用。
討論WPF中的 併發性時,確實有兩個核心概念 - 調度程序和線程關係。
在WPF的設計階段,目標是移動到一個單一的 執行線程,而是一個非線程「關聯」模型。線程 親和力發生在組件使用正在執行的線程的標識來存儲某種類型的狀態時。這種最常見的形式是 使用線程本地存儲(TLS)來存儲狀態。線程親和力 要求每個邏輯執行線程僅由操作系統中的一個 物理線程擁有,這可能會成爲內存密集型內存 。最後,WPF的線程模型與 現有的單線程執行的User32線程模型保持同步,並且線程相關性爲 。主要原因是互操作性 - OLE 2.0,剪貼板和Internet Explorer等系統都需要 單線程關聯(STA)執行。
鑑於您擁有使用STA線程的對象,您需要一種 線程之間的通信方式,並驗證您是否位於正確的 線程上。這裏就是調度員的角色。調度員是基本的消息調度系統,具有多個優先級排隊隊列。 消息的示例包括原始輸入通知(鼠標移動), 框架函數(佈局)或用戶命令(執行此方法)。 通過派生自DispatcherObject,您創建了一個CLR對象,它具有 STA行爲,並且將在創建 時間時獲得指向調度程序的指針。
你可以閱讀完整的文章here
我個人比較喜歡WPF的單線程模型,在具有使用鎖定和線程同步技術。Dispatcher可用於將消息傳遞給different priority levels的主UI線程,該線程負責處理大多數小型後臺進程,如果需要進行繁重的處理,則仍然可以爲此創建自己的後臺線程。
WPF與絕大多數UI工具包一樣,通過抽取消息循環來工作。由於消息可能隨時出現並影響任何控件,因此您需要全局鎖定。爲了減少錯誤發生,你可能需要一個函數來調用鎖下的委託。也許是這樣的:
Dispatcher.Invoke(Delegate, Object())
,這被編組到UI線程,而不是獲取全局鎖時,這只是一個實現細節。
所以真的很簡單的答案是WPF只是建立在舊的東西與開發人員一個閃亮的友好界面。因此STA模型。 – Andy 2012-01-04 20:20:42
+1。營銷揭穿! – 2012-01-04 20:28:58
- 1. 爲什麼Cross線程UI組件調用中沒有EndInvoke?
- 2. WPF - 完成和UI線程
- 3. WPF System.Timer和UI線程
- 4. WPF中的多線程UI
- 5. 爲什麼只有Android的UI線程更新UI?
- 6. 爲什麼WPF控件沒有標籤屬性?
- 7. UI線程和渲染線程有什麼區別?
- 8. 調度程序線程如何在wpf UI控件中工作
- 9. 爲什麼異步回調在WPF UI線程
- 10. WPF:爲什麼UI和渲染線程之間的雙向溝通
- 11. 爲什麼不是WPF控件中的所有事件
- 12. wpf後臺線程更新UI控制
- 13. 線程和CPU親和力
- 14. 爲什麼在WPF中UI的可伸縮性很重要?
- 15. 爲什麼Task.Factory.FromAsync阻塞UI線程?
- 16. 通知WPF中具有特定屬性的所有子控件
- 17. 在WinForms中,爲什麼不能從其他線程更新UI控件?
- 18. UI線程有什麼特別之處?
- 19. 獨立的UI線程上的WPF控件?
- 20. .NET更新自己的專用UI線程上的WPF控件
- 21. 爲什麼我不能訪問WPF控件的一些屬性?
- 22. 在android中,爲什麼UI不能從UI線程更新?
- 23. 爲什麼non-ui線程無法修改視圖屬性?
- 24. 爲什麼我的後臺工作線程阻塞UI線程?
- 25. 爲什麼主線程的Looper.loop()不會阻塞UI線程?
- 26. JavaScript線程和Silverlight UI線程之間的關係是什麼?
- 27. WPF更新基於UI線程控制狀態的非UI線程數據
- 28. 爲什麼性能計數器的NextValue調用更改線程親和性掩碼
- 29. UI線程vs後臺線程 - UI控件可訪問性邊界
- 30. 我的WPF用戶控件具有單向綁定,我不知道爲什麼
MS msdn上的答案「最後,WPF的線程模型與線程關聯的單線程執行的現有User32線程模型保持同步,主要原因是互操作性 - 系統如OLE 2.0,剪貼板和Internet Explorer都需要單線程關聯(STA)執行。「 – Andy 2012-01-04 20:12:18