用 UI 多執行緒處理 WPF 大量渲染的解決方案

2022-10-05 13:06:09 字數 908 閱讀 5295

眾所周知, wpf 的 ui 渲染是單執行緒的,所以如果我們非同步或者新建執行緒去進行資料處理的時候,處理完,想要更新 ui 的時候,需要呼叫一下 dispatcher.invoke,將處理完的資料推入到 dispatcher 中,等待更新介面,不然就會報呼叫執行緒無法訪問此物件,因為另乙個執行緒擁有該物件的錯誤。

這就是為什麼 wpf 中的大多數物件派生自 dispatcherobject,因為需要 dispatcher 處理併發和執行緒的情況。

但是工作中,有時候會遇到 ui 密集型的情況,也就是介面不停渲染導致介面出現卡住的情況,這時候就是 dispatcher 忙不過來了,一般這時候,都會想要用多執行緒來渲染介面,但是乙個 dispatcher 只能為乙個執行緒服務,所以我一般會將這種 ui 密集型的介面,單獨放到乙個彈窗中,再新建乙個 ui 執行緒並指定 dispatcher 來渲染。

**也很簡單,我直接貼啦!

我在介面中放了兩個按鈕,乙個用來開啟負責大量渲染的視窗,乙個用來關閉該視窗。

window w = null;

newwindowbutton.click += (sender, args) =>

; w.show();

dispatcher.run(); // 執行 dispatcher,為新建的 ui 執行緒服務

});thread.setapartmentstate(apartmentstate.sta); // // 指定執行緒為單執行緒模式

thread.start();

};closewindowbutton.click += (sender, args) =>

;

可以看到新彈窗因為大量渲染,滑鼠一直在轉圈,無法操作,但是主視窗還是可以進行 ui 操作,所以主視窗沒有被這個大量渲染影響到。

原始碼 wpf 執行緒模型文件

WPF 多執行緒處理 2

wpf ui 設計需要自動適應窗體大小,那麼grid是非常好的布局控制項。首先看看這個控制項的布局 這個grid是3列5行的布局,grid裡面可以包含任何子元素,因此是所有布局的首選,還有一些其他的空間如dockpanel,canvas,stackpanel,warppanel也是非常好的布局控制項...

WPF多執行緒訪問主線程中的ui控制項

wpf中的ui控制項只能由建立該ui的執行緒進行操作,但是經常有些複雜操作需要另起乙個執行緒來完成,而新的次執行緒計算的後又需要操作主線程的ui,可通過以下方法實現 第一步,定義委託 public delegate void delegate child 定義操作次執行緒的委託 public del...

封裝多執行緒處理大量資料操作(一)

起因 封裝多執行緒處理大量資料操作 二 最近在寫乙個導資料的程式,需要從幾個老資料表中取出n多的資料,然後加以處理再新增到新資料庫的對應表中。單步操作太慢了,這不正是多執行緒的用武之地嗎?對於每一種資料我都得寫一套類似的 表意 如下 從老資料庫中獲得一批老資料 dataset dsuser oldd...