WPF中Dispatcher调度程序小探

源地址:http://www.cnblogs.com/deeroad/articles/1695230.html

Dispatcher,即调度程序,在每个线程中都唯一存在,负责线程中数据的各项操作。例如线程A创建了实例I,则线程B就不能直接去更新I,而必须通过线程A来委托处理。下面举个简单的例子。

     有如下简单的XAML代码,一个Label用于显示,两个Button用于更新Label数据:

    

代码
   
   
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> < Grid > < Button Content ="Button" Height ="23" HorizontalAlignment ="Left" Margin ="129,147,0,0" Name ="button1" VerticalAlignment ="Top" Width ="75" Click ="button1_Click" /> < Label Content ="Label" Height ="28" HorizontalAlignment ="Left" Margin ="129,69,0,0" Name ="label1" VerticalAlignment ="Top" Width ="207" /> < Button Content ="Button" Height ="23" HorizontalAlignment ="Left" Margin ="244,147,0,0" Name ="button2" VerticalAlignment ="Top" Width ="75" Click ="button2_Click" /> </ Grid >

在button1中:

  
  
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> private void button1_Click( object sender, RoutedEventArgs e) { label1.Content = " Updated by button1. " ; }

很显然这样可以更新label1中的数据,因为label1,button1,button2都是窗口创建时由主线程创建的,所以它们的 Dispatcher是一样的。但是假如我们在点击之后创建一个新的线程去更新label1会发生什么呢?不妨试试!

代码
   
   
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> private void button2_Click( object sender, RoutedEventArgs e) { Thread updateThread = new Thread(UpdateLabel); updateThread.Start(); } private void UpdateLabel() { label1.Content = " Updated by button2. " ; }

当我们点击button2,铛铛铛铛~~

O了,没有权限!那就对了!下面给出解决的方法,其实原理很简单,你不让我访问,那我告诉你该这么做,你自己去做呗~~

代码
   
   
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> private void button2_Click( object sender, RoutedEventArgs e) { Thread updateThread = new Thread(UpdateLabel); updateThread.Start(); } private delegate void UpdateLabelDelegate(); private void UpdateLabel() { label1.Dispatcher.Invoke( new UpdateLabelDelegate(UpdateLabelAction)); } private void UpdateLabelAction() { label1.Content = " Updated by button2. " ; }

首先定义一个托管UpdateLabelDelegate,你也尽可以创建一个带参数的托管。 label1.Dispatcher就是调用label1的调度程序,它当然有操作label1的权限,然后通过Invoke函数调用托管函数,就是这么简单!(Invoke方法是同步操作,还有一个异步操作BeginInvoke)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值