Invoke做了什么?

先看下边代码

                 while (progressBarTest.Value<  100)
                {
                    System.Threading.Thread.Sleep( 100);                    
                    //  Dispatcher.Invoke(new Action(() =>                    
                         this.progressBarTest.Value += 1;
                     // }), System.Windows.Threading.DispatcherPriority.Background);
                }

 

就是UI线程进行繁忙操作的时候,会锁死UI,ProgressBar得不到更新。 而等到While循环结束以后才会一下子更新到了100. 如果把注释的两行去掉,那就会如预期一样,ProgressBar能够持续更新。

 再看这个代码

                 while (progressBarTest.Value<  100)
                {
                    System.Threading.Thread.Sleep( 100);
                     this.progressBarTest.Value +=  1;
                    Dispatcher.Invoke( new Action(() =>{}), System.Windows.Threading.DispatcherPriority.Background);
                }

 

 运行的时候会发现, 效果是一样的。 也就是说空的Invoke委托也有相同的效果。 我的想法是, Invoke的时候,UI线程会等待Render线程结束Render才会继续运行。如果UI线程不返回,也就是说当前的DispatcherOperation没有结束不会进行其他的DO的调用,除非显示的请求如此。

还有一个想法 就是 this.progressBarTest.Value += 1; 这行代码的作用实际上是调用了一次BeginInvoke。 期待有时间验证一下。

 

 

posted on 2012-10-31 17:37 hchlee 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/lihongchao/archive/2012/10/31/2748427.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值