WPF UI线程卡顿的一些理解

WPF MVVM模型中线程分为UI线程(主线程)和其他线程(新建的线程)

UI线程主要工作:

1、负责响应外部的输入事件

2、负责渲染UI界面,包括绘图、动画等

其他线程:

1、负责进行数据采集处理

2、负责进行消息的分发

 

实际的工作中我们要合理使用线程,特别是大量的数据展示,图表动画渲染。不然很容易导致UI界面的卡顿。

在MVVM模型中,我们强调数据驱动视图。数据通过绑定来更新视图,所以在处理数据量很大的数据时一定要使用后台线程进行处理,避免占用UI线程导致UI卡顿。

在使用Prism等MVVM框架时,尽量在使用事件聚合器进行消息发布订阅时不使用UI线程(ThreadOption.UIThread)。除非特定的情况下数据量很小而且更新频率很低。

一般人眼的1S能捕获的帧在30帧,所以我们进行大数据量图表渲染时可以尽量控制数据的刷新帧数以保证整体UI界面的响应速度。当然这和电脑的性能有一定关系,

这里如果一般的电脑出现UI响应慢或者卡顿现象可以从这方面着手解决。

WPF 在设计之初就是单UI线程的,所以我们一般在遇到性能问题,尽量还是考虑后台线程来更新数据进而通过绑定更新前台数据。

然而实际开发中特殊情况下(客户的需求,哈哈)可能需要提高软件的响应速度以及UI操作对正在渲染的图表动画导致影响的问题,这个时候就需要多UI线程的一些

操作来实现。

线程模型 - WPF .NET Framework | Microsoft Learn 可以先学习下WPF的线程模型。

    Thread newWindowThread = new Thread(ThreadStartingPoint);
    newWindowThread.SetApartmentState(ApartmentState.STA);
    newWindowThread.IsBackground = true;
    newWindowThread.Start();

    private void ThreadStartingPoint()
    {
       Window newuiwindow= new MultiWindow();
       newuiwindow.Closed+=(sender,e)=>{

      newuiwindow.DataContext = null;

          newuiwindow= null;

      Dispatcher.CurrentDispatcher.InvokeShutdown();

         }        

        System.Windows.Threading.Dispatcher.Run();
    }

这里就是通过一个新的UI线程打开窗口,新起的UI线程有属于自己调度器,在和软件的主UI线程交互时需要多多注意。特别是操作主UI线程的元素时,一定要调度到主UI线程。

在窗口关闭时要注意新UI线程资源的释放。

 

posted @ 2024-01-24 16:48  兮夜  阅读(396)  评论(0编辑  收藏  举报