WPF UI线程安全性
来源:互联网 发布:slf4j 输出sql 编辑:程序博客网 时间:2024/05/21 19:34
WPF所有的控件都是继承于 DispatcherObject, 在DispatcherObject 有个属性是Dispatcher(每个UI线程创建的所有UI都是同一个), 这个Disapatcher对象管理了Windows窗口的消息循环,跟VC++ /WinForm窗口一样,WPF的也要有消息循环,只不过WPF对所有的消息进行了特殊的封装,将MSG转换为DispatcherOperation, Dispacher对象中包含了一个DispatcherOperation的列表,该列表就是我们之前理解的消息队列。
在进行UI多线程操作的时候,WPF 中所有的控件可以执行UiObject.Dispatcher.Invoke()/BeginInvoke(),其中Invoke是同步操作, BeginInvoke是异步操作,在执行Invoke的时候实际上执行的也是BeginInvoke类似的过程,只不过是用了特殊的优先级-DispatcherPriority.Send,这是一个特殊的Priority,在接收到该优先级的时候不会把消息(DispatcherOperation)放到消息队列,而是会直接执行该消息,注意WinForm是通过Control类的Invoke和BeginInvoke来实现多线程UI操作的,WPF跟WinForm类似,只不过进行了一定的封装。
一个简单的例子:
TextBlock textBlock = new TextBlock() { Text = "1" }; Thread thread = new Thread(new ThreadStart(() => { //做一些耗时操作,这里用线程休眠10秒来模拟 Thread.Sleep(TimeSpan.FromSeconds(10)); textBlock.Dispatcher.Invoke(new Action(() => { textBlock.Text = "2"; })); })); thread.Start();
在WPF/Winform开发的时候,由于Performance的问题,比如用户在界面上进行了一个操作,可能后台执行过程需要很长时间,开发人员需要给用户显示操作处理状态,并且允许用户可以进行其他的操作,不然界面就是处于长时间的等待,像假死状态,而微软为此给我们增加了类BackgroundWorker, 利用该类可以做后台逻辑处理,通过该类的回调函数给用户显示处理状态。该类有三个事件DoWork,ProgressChanged, RunWorkerCompleted,具体应用可以查看MSDN
总结,WPF窗口程序启动时Application.Run实际上运行的是Dispatcher.Run(),由于Dispatcher的构造函数是Private的,所以我们要向访问当前线程对应的Dispatcher可以用Dispatcher.CurrentDispatcher.
- WPF UI线程安全性
- WPF 跨线程操作UI
- WPF中使用UI线程
- WPF中非UI线程修改UI元素
- C#学习之五---WPF-UI线程
- wpf调用外部线程操作ui方法
- 线程安全性
- 线程安全性
- 线程安全性
- 线程安全性
- 线程安全性
- 线程安全性
- 线程安全性
- 线程安全性
- 线程安全性
- 线程安全性
- 线程安全性
- 线程安全性
- 支付宝手机网站支付接口集成的经验小结
- The Knapsack problem Gym
- otsu自适应阈值分割的算法描述和opencv实现,及其在肤色检测中的应用
- SPOJ-Grid ,水广搜easy bfs
- 如何在Eclipse上配置WebLogic Server
- WPF UI线程安全性
- Retrofit全攻略——进阶篇
- java:多线程
- 初探React-Native之Windows下Android端环境搭建
- 我的科研生活2017-3-8
- SDUT 2134 数据结构实验之栈四:括号匹配
- 果断收藏!67句神奇的英语谚语集锦!
- 區域閾值(adaptiveThreshold)
- java虚拟机-JVM