线程操纵UI问题

Posted Lulus

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程操纵UI问题相关的知识,希望对你有一定的参考价值。

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问题的主要内容,如果未能解决你的问题,请参考以下文章

Android开发——UI_片段

谷歌地图片段内的片段可以操纵我的地图

活动到片段方法调用带有进度条的线程

多线程更新UI的常用方法

浅谈android中的异步加载一

是否需要锁定阅读对象?