WPF只允許UI線程修改UI骨望,其他線程必須通過Invoke、委托(安全性)
Winform可以開啟/關(guān)閉“只允許UI線程修改UI”
在WPF中非UI線程修改UI的方法
非UI線程直接修改UI欣舵,會(huì)報(bào)錯(cuò)
System.InvalidOperationException:“調(diào)用線程無法訪問此對象擎鸠,因?yàn)榱硪粋€(gè)線程擁有該對象≡等Γ”
正確的做法是
Task t = new Task(() =>
{
NameLabel.Dispatcher.Invoke(new Action(delegate
{
NameLabel.Content = "我用UI線程修改了NameLabel的文字";
}));
});
t.Start();
示例代碼
https://github.com/zLulus/NotePractice/tree/dev3/WPF/WpfDemo/ChangeUI
補(bǔ)充:Dispatcher(調(diào)度員)
使用一個(gè)專用的 UI 線程來完成界面的操作和更新劣光,這個(gè)線程會(huì)關(guān)聯(lián)一個(gè)唯一的WPF Dispatcher 對象,用于調(diào)度按優(yōu)先順序排列的工作項(xiàng)隊(duì)列糟把。Application.Run() 實(shí)際上就是對 Dispatcher.Run() 的間接調(diào)用绢涡。
WPF Dispatcher通過循環(huán)來處理工作項(xiàng)隊(duì)列,這個(gè)循環(huán)通常被成為 "幀 (DispatcherFrame)"遣疯。Dispatcher.Run() 創(chuàng)建并啟動(dòng)這個(gè)幀雄可,這也是 Application.Run() 啟動(dòng)消息循環(huán)的最終途徑。