2012-01-04 37 views
9

爲什麼創建控件的線程是可以更新它的線程?爲什麼沒有MS讓人們能夠使用鎖定和其他線程同步技術讀取和寫入具有多個線程的UI控件的屬性。爲什麼WPF中的UI控件具有線程親和性?

+2

MS msdn上的答案「最後,WPF的線程模型與線程關聯的單線程執行的現有User32線程模型保持同步,主要原因是互操作性 - 系統如OLE 2.0,剪貼板和Internet Explorer都需要單線程關聯(STA)執行。「 – Andy 2012-01-04 20:12:18

回答

11

每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線程,該線程負責處理大多數小型後臺進程,如果需要進行繁重的處理,則仍然可以爲此創建自己的後臺線程。

3

WPF與絕大多數UI工具包一樣,通過抽取消息循環來工作。由於消息可能隨時出現並影響任何控件,因此您需要全局鎖定。爲了減少錯誤發生,你可能需要一個函數來調用鎖下的委託。也許是這樣的:

Dispatcher.Invoke(Delegate, Object()) 

,這被編組到UI線程,而不是獲取全局鎖時,這只是一個實現細節。

+2

所以真的很簡單的答案是WPF只是建立在舊的東西與開發人員一個閃亮的友好界面。因此STA模型。 – Andy 2012-01-04 20:20:42

+0

+1。營銷揭穿! – 2012-01-04 20:28:58

相關問題