码迷,mamicode.com
首页 > 编程语言 > 详细

线程操纵UI问题

时间:2017-12-29 18:16:11      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:hub   origin   wpf   task   方法   image   post   修改   tag   

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问题

标签:hub   origin   wpf   task   方法   image   post   修改   tag   

原文地址:https://www.cnblogs.com/Lulus/p/8145717.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!