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";
}));
}));
thr

WPF的UI控件基于DispatcherObject,其Dispatcher管理消息循环。在多线程操作UI时,使用Invoke(同步)和BeginInvoke(异步)确保线程安全。Invoke以高优先级直接执行,而BeginInvoke将操作放入消息队列。这与WinForm的Control.Invoke和BeginInvoke类似,但WPF进行了封装。示例中展示了Dispatcher的使用,强调Application.Run实际运行Dispatcher.Run。
最低0.47元/天 解锁文章
1451

被折叠的 条评论
为什么被折叠?



