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**:
<c#後台**: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
>
//// 的互動邏輯
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...