Dispatcher的Invoke和BeginInvoke

WPF的应用程序运行时,就有一个主线程(UI线程)和其他的一些子线程。

子线程是不能修改UI线程,必须通过UI线程的Dispatcher来完成。

简单点来说:子线程是不能修改程序UI的,除非用UI线程的Dispatcher来注册。

例如:

private void Invoke_Button(object sender, RoutedEventArgs e)  {            Task.Run(() =>            {                Thread.Sleep(1000);                this.TextBlock.Text = "10";            });        }

另起一个线程去修改UI上TextBlock控件的值。就会报异常:System.InvalidOperationException: '调用线程无法访问此对象,因为另一个线程拥有该对象。'

Dispatcher两种注册方式:

Invoke:同步调用,即会在子线程执行完成后返回。

private void Invoke_Button(object sender, RoutedEventArgs e)        {            Task.Run(() =>            {                Dispatcher.Invoke(() =>                {                    Thread.Sleep(5000);                    this.TextBlock.Text = "10";                });            });        }

BeginInvoke:异步调用,即立即返回。

private void BeginInvoke_Button(object sender, RoutedEventArgs e)
        {
            Task.Run(() =>
            {
                Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
                {
                    this.TextBlock.Text = "3";
                    Thread.Sleep(10000);
                }));
            });
        }

总结:当在子线程中调用Dispather注册时,Dispatcher中的Action依然还是占用着UI线程,所以Dispatcher的工作项依然是越少越少,耗时操作越少越好。

BeginInvoke效率要更高一点。反应更灵敏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值