WPF的Dispatcher类里的BeginInvoke,Invoke,InvokeAsync

首先更深入的原理知识请移步:https://blog.csdn.net/WPwalter/article/details/78093917

这里主要用上几个实例。总结一下:

1.BeginInvoke和InvokeAsync原理一致,可取得一致的结果,用InvokeAsync会更实用方便,因为可以直接用上Action和Fun方法。

2.Invoke会阻塞线程,直到Invoke里的代码完成,InvokeAsync和BeginInvoke会直接运行后面的代码。

来看一个简单的实例:

private void btn_Click(object sender, RoutedEventArgs e)
        {
            Thread t = new Thread(DoSomeThing);
            t.Start();

            lable.Content= "1";
            this.Dispatcher.Invoke(() => { lable.Content += "2";Thread.Sleep(2000); });
            
            lable.Content += "3";
            
                

        }

        private void DoSomeThing()
        {
            for(int i=0;i<10;i++)
            {
                this.Dispatcher.Invoke(()=> { lable.Content += i.ToString(); });
                Thread.Sleep(1000);
            }
        }

结果是:

可以发现,先执行Invoke,然后执行Thread里的内容。

接下来,把Invoke换成InvokeAsync。

private void btn_Click(object sender, RoutedEventArgs e)
        {
            Thread t = new Thread(DoSomeThing);
            t.Start();

            lable.Content= "1";
            this.Dispatcher.InvokeAsync(() => { lable.Content += "2";Thread.Sleep(2000); });
            lable.Content += "3";
        }

会发现结果变了。3在前,2在后,也就是说先执行了InvokeAsync。

接着再把DoSomeThing的Invoke也改成InvokeAsync,最后会发现结果中0变成了1,这是因为这里的进程在排队,先结束了btn_click里的InvokeAsync,然后再来执行DoSomeThing里的InvokeAsync,而此时i的值已经变成了1。

private void DoSomeThing()
        {
            for(int i=0;i<10;i++)
            {
                this.Dispatcher.InvokeAsync(()=> { lable.Content += i.ToString(); });
                Thread.Sleep(1000);
            }
        }

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值