線程操縱UI問題
阿新 • • 發佈:2017-12-29
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問題