1. 程式人生 > >線程操縱UI問題

線程操縱UI問題

width png param sys filesize chang ack bsp string

WPF只允許UI線程修改UI,其他線程必須通過Invoke、委托(安全性)
Winform可以開啟/關閉“只允許UI線程修改UI”

在WPF中非UI線程修改UI的方法

非UI線程直接修改UI,會報錯

System.InvalidOperationException:“調用線程無法訪問此對象,因為另一個線程擁有該對象。”

正確的做法是

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

補充:Dispatcher(調度員)

使用一個專用的 UI 線程來完成界面的操作和更新,這個線程會關聯一個唯一的WPF Dispatcher 對象,用於調度按優先順序排列的工作項隊列。Application.Run() 實際上就是對 Dispatcher.Run() 的間接調用。

WPF Dispatcher通過循環來處理工作項隊列,這個循環通常被成為 "幀 (DispatcherFrame)"。Dispatcher.Run() 創建並啟動這個幀,這也是 Application.Run() 啟動消息循環的最終途徑。

技術分享圖片 技術分享圖片

參考資料:
http://developer.51cto.com/art/200912/174005.htm

線程操縱UI問題