WPF_UI线程
一、線程概述:
WPF 應用程序從兩個線程開始:
一個用于處理呈現
一個用于管理 UI
呈現線程有效地隱藏在后臺運行,而UI線程則接收輸入、處理事件、繪制屏幕以及運行應用程序代碼。
大多數應用程序都使用一個 UI 線程,但在某些情況下,最好使用多個線程。我們將在后面舉例說明這一點。
UI 線程對一個名為 Dispatcher 的對象內的工作項進行排隊。
Dispatcher基于優先級選擇工作項,并運行每一個工作項,直到完成。每個UI線程都必須至少有一個Dispatcher,并且每個 Dispatcher 都只能在一個線程中執行工作項。
要構建響應速度快、且用戶友好的應用程序,訣竅是減小工作項,以最大限度地提高Dispatcher吞吐量。這樣,工作項將永遠不會因為在Dispatcher隊列中等待處理而失效。輸入與響應之間的任何可察覺的延遲都會使用戶不快。
那么,WPF應用程序應如何處理大型操作呢?如果您的代碼涉及大型計算,或者需要查詢某臺遠程服務器上的數據庫,應怎么辦呢?通常的辦法是在單獨的線程中處理大型操作,而專門讓UI線程來負責處理Dispatcher隊列中的工作項。當大型操作完成時,可以將結果報告給 UI 線程來顯示。
一直以來,Windows只允許創建UI元素的線程訪問這些元素。這意味著負責某項長時間運行任務的后臺線程無法更新已完成的文本框。Windows 這樣做是為了確保 UI 組件的完整性。如果列表框的內容在繪制過程中被后臺線程更新,那么該列表框看上去將會很奇怪。
WPF 使用一種內置互斥機制來強制執行這種協調。WPF 中的大多數類都派生自 DispatcherObject。DispatcherObject 在構造時存儲對鏈接到當前所運行線程的 Dispatcher 的引用。實際上,DispatcherObject與創建它的線程關聯。
在程序執行過程中,DispatcherObject 可以調用它的公共 VerifyAccess 方法。
VerifyAccess 檢查與當前線程關聯的 Dispatcher,并將它與構造過程中存儲的 Dispatcher 引用進行比較。
如果兩者不匹配,VerifyAccess將引發異常。VerifyAccess 用于在每個屬于 DispatcherObject 的方法的開頭調用。
如果只有一個線程可以修改 UI,那么后臺線程如何與用戶交互呢?
后臺線程可以請求 UI 線程代表它執行操作。這是通過向 UI 線程的 Dispatcher 注冊工作項來完成的。
Dispatcher 類提供兩個注冊工作項的方法:Invoke 和 BeginInvoke。
這兩個方法均調度一個委托來執行。
Invoke 是同步調用,也就是說,直到 UI 線程實際執行完該委托它才返回。
BeginInvoke 是異步的,將立即返回。
Dispatcher 按優先級對其隊列中的元素進行排序。向 Dispatcher 隊列中添加元素時可指定 10 個級別。
這些優先級在 DispatcherPriority 枚舉中維護。有關 DispatcherPriority 級別的詳細信息可以在 Windows SDK 文檔中找到。
轉載于:https://www.cnblogs.com/tranw/p/6443825.html
總結
- 上一篇: R语言数据预处理
- 下一篇: asp.net ajax控件工具集 Au