C Wpf非同步修改UI,多執行緒修改UI(二)

2021-09-08 19:06:27 字數 3468 閱讀 7056

1.使用定時器非同步修改

這是相對比較簡單的方法

在wpf中定時器使用diapatchertimer,不使用timer原因:

在乙個應用程式中,timer會重複生成time事件,而dispatchertimer是乙個整合到了dispatcher佇列中的時鐘,這可以使它被按照指定的時間間隔以指定的priority定期執行。

對於乙個timer時鐘事件,系統並不能保證在時間間隔到達後被立即執行,但是能夠確保在時間間隔到達之前不被執行。這是因為dispatchertimer像其他操作一樣被放置在了dispatcher佇列中。何時執行dispatchertimer事件依賴於佇列中的其他任務以及他們的優先順序.

如果乙個wpf應用程式使用了timer時鐘,那麼它的事件必須在乙個單獨的時鐘執行緒中執行,而不是在ui執行緒中,這對於wpf應用程式毫無用處——你沒法在ui執行緒之外直接訪問ui元素,而只能通過invoke或者begininvoke將操作傳送給dispatcher 物件,委託dispatcher去執行ui操作。

看到這裡,你大概知道了為什麼我們在wpf中應該用dispatchertimer而不是timer了:dispatchertimer與dispatcher執行於同乙個執行緒中——ui執行緒,而且具有相同的dispatcherpriority優先順序。

例項:xaml**:

<

grid

>

<

textbox

x:name

="textbox"

padding

="10"

height

="45"

="wrap"

text

="textbox"

verticalalignment

="top"

margin

="10,105,10,0"

/>

grid

>

後台**:

//

啟動其他執行緒處理,呼叫失敗

> );

//主線程呼叫成功

2.使用backgroundworker

這個類是專門用於簡化windows form程式與執行緒相關的問題設計的,同樣適用於wpf程式.適合於乙個長期的後台程序,支援進度通知,取消支援,完成通知等功能.

使用方法也很簡單,建立乙個backfruopworker例項,它有幾個事件.

dowork事件會在另外乙個執行緒中執行,用runworkerasync()啟動.所以在這個事件中不要去處理修改介面的事情

runworkercompleted事件,在dowork事件返回時(正常或者異常返回),在圖形的執行緒中執行,所以可以修改介面

progresschanged事件,使用reportprogress()方法呼叫,同時是在圖形介面的執行緒中執行,通常負責修改一下進度條什麼的.而reportprogress()方法,通常會在dowork的事件中呼叫,然後給乙個百分比的值.要使用這個功能,需要把workerreportsprogress屬性設定成true

另外值得一說的是,要取消支援需要把workersupportscancellation屬性設為true,使用cancelasync()方法呼叫,但是這個呼叫不會終止程序,所以在dowork事件中需要判斷cancellationpending.

例項:xaml**:

<

stackpanel

>

<

progressbar

name

="progressbar"

height

="20"

width

="200"

margin

="10,80,20,10"

>

progressbar

>

<

button

name

="btnprocess"

width

="100"

click

="btnprocess_click"

margin

="5"

>開始後台任務

button

>

<

button

name

="btncancel"

width

="100"

click

="btncancel_click"

margin

="5"

>取消後台任務

button

>

<

label

x:name

="label"

content

="label"

margin

="10"

/>

stackpanel

>

c#後台**:

///

/ 的互動邏輯

Qthread執行緒修改UI

from pyqt5.qtcore import from pyqt5.qtgui import from pyqt5.qtwidgets import import time 訊號傳參型別 pyqtsignal 無引數訊號 pyqtsignal int 乙個引數 整數 的訊號 pyqtsignal...

C 多執行緒使用委託修改介面UI

多執行緒修改介面時,需要考慮到一般多執行緒讀髒資料,資料重寫等問題,所以一般把多線成修改介面的方法交由ui執行緒本身執行,這樣就使多執行緒修改ui變成單執行緒修改了,問題得到簡化 多執行緒如何將修改介面的方法交給ui執行緒呢,就是用c 的委託了 我一般的做法如下 delegate void upda...

跨執行緒修改UI控制項

1.直接修改,失敗引發異常.namespace test private void setlabeltext private void btnvisitlabel click object sender,eventargs e 2.使用 呼叫ui控制項的invoke方法修改,成功.namespace...