首页 > 其他分享 >WPF UI线程卡顿的一些理解

WPF UI线程卡顿的一些理解

时间:2024-01-24 16:56:05浏览次数:23  
标签:UI newuiwindow 线程 WPF newWindowThread 卡顿

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线程资源的释放。

 

标签:UI,newuiwindow,线程,WPF,newWindowThread,卡顿
From: https://www.cnblogs.com/congroo/p/17984945

相关文章

  • Python并发编程之进程间通信与线程间通信
    进程间通信与线程间通信【一】进程间通信(IPC)​ 进程间通信(Inter-ProcessCommunication,IPC)是指在不同进程之间进行数据交换和信息传递的机制。在多进程系统中,不同进程可能运行在不同的地址空间,因此需要一些特殊的方法来实现它们之间的通信。以下是一些常见的进程间通信的方法:......
  • 更新VS2022新版本后,高概率弹出“为防止...时出现不安全的中止,已允许所有线程进行。这
    目前我的VS版本是17.8.5:印象中上一个小版本的时候就已经出现这个问题了。自己的应用,点击调试的时候,高概率出现下面的对话框:但又不是每次都会出现。程序没有设置任何的断点。多个程序都会出现。目前不知道啥原因引起。......
  • 线程管理神器:Executors全面解析
    内容摘要Executors在Java中提供了快速创建线程池的能力,其优点显著:它简化了线程管理,减少了代码量;提供了多种类型的线程池以适应不同场景;通过复用线程,降低了资源消耗,提高了系统响应速度和吞吐量。使用Executors,开发者能够更专注于业务逻辑,而无需深入底层线程细节。官方文档:https:/......
  • uboot-6_menuconfig/Kbuild图形化配置原理
    1ncurses库安装uboot或Linux内核可以通过输入“makemenuconfig”来打开图形化配置界面,menuconfig是一套图形化的配置工具,需要ncurses库支持。sudoapt-getinstallbuild-essentialsudoapt-getinstalllibncurses5-dev2menuconfig菜单使用说明和举例menuconfig重......
  • dotnet wpf 点击事件
    secs_wpf\MainWindow.xaml.csusingSystem.Text;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Data;usingSystem.Windows.Documents;usingSystem.Windows.Input;usingSystem.Windows.Media;usingSystem.Windows.Media.Imaging;usi......
  • 通过CanvasRenderer.SetColor和Image.color修改UI组件颜色的区别
    1)通过CanvasRenderer.SetColor和Image.color修改UI组件颜色的区别2)OPPO相关机型没法在Unity启用90或120FPS3)手机输入法中的emoji4)UnityApplicationPatching怎么用这是第369篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面......
  • linux进阶之nmtui和nmcli配置网络
    CentOS7配置网络推荐使用NetworkManager服务(不推荐network服务)。图形化方式:nmtui或Applications->SystemTools->Settings->Network命令方式:->IPv4寻址方式 [X]Automaticallyconnect->默认->自动连接->ONBOOT=yes [X]Availabletoallusers->默认->所有用户均可使用......
  • python多线程id获取
    demoimportthreadingimporttimedefprint_thread_info(thread_name):"""线程函数,打印线程名称和ID以及一些文本"""foriinrange(3):time.sleep(1)thread_id=threading.current_thread().identprint(f"{thr......
  • python requirements.txt的生成和安装
     一、在python代码迁移环境时需要保证各个依赖包版本一致以避免出现一些问题,批量安装依赖包方法如下:1)生成requirement.txt在服务器中切换到项目路径下,执行以下命令:piplist--format=freeze>requirements.txt所生成的requirement.txt中包含依赖包名和版本2)批量安装依赖......
  • QOJ 1963 Squid Game
    令\(a\leb\lec\)。这显然是可以通过交换得到的。考虑若\(a=1\)怎么做。考虑到若把\(b\)或者\(c\)给\(a\),\(a\)就会翻倍。那就把\(b\)拆成二进制,考虑让\(b\)变为\(0\)。从低位到高位,如果\(b\)这一位为\(1\)就让\(b\)给\(a\),否则\(c\)给\(a\)。那......