WPF 鼠标在控件上晃动,CPU占用高,界面不刷新问题

WPF 鼠标在控件上晃动,CPU占用高,界面不刷新问题

首先,在MVVM模式下,我们刷新界面的方式工作通过属性绑定转移到更新绑定数据源。此时,我们通常会使用子线程去执行一些查询等耗时任务,执行完成之后,直接更新数据源。或者开一个定时器(System.Threading.Timer)去实时更新我们的绑定数据源。

一般情况下,我们的界面更新是很正常的。

但是,当我们更新的数据源很多,更新频率很快时。晃动我们鼠标(在控件面板上移动)时,有时会发现一个有趣却又很苦逼的现象——鼠标晃动导致界面更新卡住了。

我最开始遇到这个问题时,也是百度一顿乱搜。问问群里大佬。无果。

开始猜想与试验…

经过多种试验发现:

如果这个更新数据源的方式通过主线程调度(System.Windows.Threading.Dispatcher.CurrentDispatcher或者控件的Dispatcher)Invoke调用时,界面刷新不受鼠标移动影响

解决方案:

            // 处理任务的子线程
            Task.Run(() =>
            {
                while (true)
                {
                    // 获取数据,随便模拟的
                    int data = new Random().Next(100);

                    // 更新绑定数据源,使用主线程的调度器来进行调用
                    System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke(() =>
                    {
                        Base.ServiceProvider.Get<MainViewModel>().CurrentTime = data.ToString();
                    });
                }
            });

最后,谈谈个人理解:

由于子线程去更新数据,界面刷新需要在主线程空闲的时候才会去更新数据。当鼠标在移动时,主线程会开辟部分资源去等待响应鼠标事件(这块资源挺大,因为CPU一下从1涨到了8左右),当子线程刷新数据源过多时,导致CPU属性通知资源不足,从而界面卡死不更新。


积跬步以至千里:) (:一阵没来由的风

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值