WPF Dispatcher在界面操作中作用体现

对于一个开发人员来说,可能在开发一个程序的时候对图形界面的要求并不是很高,因为他们不是美工。那么,使用了WPF后,开发人员可以轻松的实现精美的图形界面。#t#

十多年的范县网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。网络营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整范县建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联公司从事“范县网站设计”,“范县网站推广”以来,每个客户项目都认真落实执行。

使用一个专用的 UI 线程来完成界面的操作和更新,这个线程会关联一个***的WPF Dispatcher 对象,用于调度按优先顺序排列的工作项队列。Application.Run() 实际上就是对 Dispatcher.Run() 的间接调用。

WPF Dispatcher通过循环来处理工作项队列,这个循环通常被成为 "帧 (DispatcherFrame)"。Dispatcher.Run() 创建并启动这个帧,这也是 Application.Run() 启动消息循环的最终途径。

 
 
 
  1. public sealed class Dispatcher  
  2. {  
  3. [SecurityCritical, 
    UIPermission(SecurityAction.
    LinkDemand, Unrestricted=true)]  
  4. public static void Run()  
  5. {  
  6. PushFrame(new DispatcherFrame());  
  7. }  

DispatcherFrame 可以嵌套,并通过检查 Continue 属性来决定循环是否继续。我们可以通过调用 Dispatcher.ExitAllFrames() 来终止所有的帧循环,当然这种编程方式并不可取,可能会造成一些意外出现。

与WPF Dispatcher调度对象想对应的就是 DispatcherObject,在 WPF 中绝大部分控件都继承自 DispatcherObject,甚至包括 Application。这些继承自 DispatcherObject 的对象具有线程关联特征,也就意味着只有创建这些对象实例,且包含了 Dispatcher 的线程(通常指默认 UI 线程)才能直接对其进行更新操作。

当我们尝试从一个非 UI 线程更新一个标签,会看到一个如下的异常。

 
 
 
  1. private void button1_Click
    (object sender, RoutedEventArgs e)  
  2. {  
  3. new Thread(() => this.label1.
    Content = DateTime.Now.
    ToString()).Start();  

按照 DispatcherObject 的限制原则,我们改用 Window.Dispatcher.Invoke() 即可顺利完成这个更新操作。

 
 
 
  1. private void button1_Click
    (object sender, Routed
    EventArgs e)  
  2. {  
  3. new Thread(() => 
  4. {  
  5. this.Dispatcher.Invoke
    (DispatcherPriority.Normal,  
  6. new Action(() => this.
    label1.Content = DateTime.
    Now.ToString()));  
  7. }).Start();  

如果在其他项目(比如类库)中,我们可以用 Application.Current.Dispatcher.Invoke(...) 完成同样的操作,它们都指向 UI Thread Dispatcher 这个***对象。

WPF Dispatcher还提供了 BeginInvoke 这个异步版本。

 
 
 
  1. private void button1_Click(object 
    sender, RoutedEventArgs e)  
  2. {  
  3. new Thread(() => 
  4. {  
  5. Application.Current.Dispatcher.
    BeginInvoke(DispatcherPriority.Normal,  
  6. new Action(() => 
  7. {  
  8. Thread.Sleep(3000);  
  9. this.label1.Content = 
    DateTime.Now.ToString();  
  10. }));  
  11. MessageBox.Show("Hi!");  
  12. }).Start();  

凡事都有例外,WPF 还提供了一种继承自 Freezable 的类型,尽管 Freezable 也间接继承自 DispatcherObject,但当诸如WPF Dispatcher这类对象从修改状态变成冻结状态时,它即变成自由线程对象,不在具有线程关联。

标题名称:WPF Dispatcher在界面操作中作用体现
当前网址:http://www.shufengxianlan.com/qtweb/news34/46734.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联