2009-09-04 95 views

回答

4

編輯。

如果您有一個長時間運行的任務,請使用BackGroundWorker將其委託給後臺線程,然後您將不需要使用調度程序將消息傳遞迴UI。 This is a very good article.


它是一個非常寬泛的問題。我建議你從WPF Architecture開始。

在WPF中的大部分對象由 DispatcherObject的,它提供了 基本構造爲處理 併發線程和派生。基於由調度員實現的消息系統 ,WPF是 。這個 的工作方式非常類似於熟悉的Win32 消息泵;實際上,WPF 調度程序使用User32消息執行交叉線程調用 。

實際上有兩個核心概念,以 在WPF討論併發 當明白 - 調度和線程 親和力。

在WPF的設計階段, 目標是移動到 執行一個線程,而是一個非線程 「affinitized」的模式。線程親和力 發生在組件使用執行線程的 身份到 時存儲某種類型的狀態。最常見的 這種常見形式是使用 線程本地存儲(TLS)來存儲 狀態。線程親和力要求每個邏輯執行線程 僅由 中的一個物理線程擁有,該操作系統可能會變爲 內存密集型。最後,WPF的 線程模型與 保持同步,現有的User32線程模型 單線程執行與線程 親和力。此 的主要原因是互操作性 - OLE 2.0,剪貼板和Internet Explorer等系統都需要單線程 親和性(STA)執行。

既然你有STA線程 對象,你需要一種方法來 線程之間的溝通, 驗證你是正確的 線程。這裏就是 調度員的角色。調度員是一個基本的 消息調度系統,其中 多個優先隊列。消息的示例 包括原始輸入 通知(鼠標移動),框架 函數(佈局)或用戶命令 (執行此方法)。通過從DispatcherObject派生 ,您將創建一個具有STA行爲的 CLR對象,並且 將在創建時獲得指向 調度員的指針。

+1

嗯..我懷疑是當一個長時間運行的過程發生在用戶界面後面,那時候WPF UI將不會響應或使用調度程序線程它可以解決嗎? – 2009-09-04 10:35:19