【WPF.NET开发】优化性能:对象行为
本文内容
- 不删除对象的事件处理程序可能会使对象保持活动状态
- 依赖属性和对象
- Freezable 对象
- 用户界面虚拟化
了解 WPF 对象的内部行为有助于在功能和性能之间做出适当的取舍。
1、不删除对象的事件处理程序可能会使对象保持活动状态
对象传递给其事件的委托是对该对象的有效引用。 因此, 事件处理程序可以使对象保持活动状态的时间超过预期时间。 当对已注册为侦听对象事件的对象执行清理时,在释放对象前删除委托是非常必要的。 将不需要的对象保持为活动状态会增加应用程序的内存使用量。 在对象为逻辑树或可视化树的根时更是如此。
WPF 为事件引入了弱事件侦听器模式,在很难跟踪源和侦听器之间的对象生存期关系时,这种模式特别有用。 某些现有 WPF 事件使用此模式。 如果要实现具有自定义事件的对象,此模式可能会有用。
有若干工具(如 CLR 探查器和工作集查看器)可以提供有关指定进程的内存使用量的信息。 CLR 探查器包括分配配置文件的许多非常有用的视图,其中包括已分配类型的直方图、分配和调用关系图、显示各代垃圾回收及上述回收之后托管堆的生成状态的时间线,以及显示每个方法分配和程序集加载的调用树。
2、依赖属性和对象
通常,访问 DependencyObject 的依赖属性的速度不会慢于访问 CLR 属性的速度。 虽然设置属性值会产生一些小的性能开销,但是获取值与从 CLR 属性获取值的速度一样快。 抵销一些小的性能开销是因为依赖属性支持可靠的功能,如数据绑定、动画、继承和样式设置。
DependencyProperty 优化
在应用程序中定义依赖属性时请务必谨慎。 如果 DependencyProperty 仅影响呈现类型元数据选项,而不影响其他元数据选项(如 AffectsMeasure),则应通替代其元数据来对其进行同样的标记。
如果并非所有属性更改都会影响测量、排列和呈现,则通过属性更改处理程序手动使测量、排列和呈现阶段无效的做法可能会更高效。 例如,你可能决定仅在值大于设置限制时才重新呈现背景。 在这种情况下,值超过设置限制时,属性更改处理程序仅会使呈现无效。
将 DependencyProperty 设置为可继承会影响性能
默认情况下,注册的依赖属性是不可继承的。 但可以显式地将所有属性设置为可继承。 尽管这是一个有用的功能,但是将属性转换为可继承会影响性能,因为会增加属性无效的时长。
谨慎使用 RegisterClassHandler
调用 RegisterClassHandler 会允许保存实例状态,但请注意,每个实例上都会调用处理程序,这将导致性能问题。 应用程序要求保存实例状态时,仅使用 RegisterClassHandler。
在注册过程中为 DependencyProperty 设置默认值
创建要求默认值的 DependencyProperty 时,请将传递的默认元数据用作 DependencyProperty 的 Register 方法的参数来设置此值。 请使用此技术,而不要在构造函数中或在元素的每个实例上设置属性值。
使用 Register 设置 PropertyMetadata 值
创建 DependencyProperty 时,可以选择使用 Register 或 OverrideMetadata 方法设置 PropertyMetadata。 尽管对象可能有一个静态构造函数来调用 OverrideMetadata,但这不是最佳方案,并且会影响性能。 为了获得最佳性能,建议在调用过程中将 PropertyMetadata 设置为 Register。
3、Freezable 对象
Freezable 是一种特殊类型的对象,具有两种状态:解冻和冻结。 尽可能冻结对象会改进应用程序性能,并缩小其工作集。
每个 Freezable 都有一个 Changed 事件,只要发生更改就会引发该事件。 不过,更改通知会降低应用程序的性能。
考虑以下示例,其中每个 Rectangle 使用相同的 Brush 对象:
rectangle_1.Fill = myBrush;
rectangle_2.Fill = myBrush;
rectangle_3.Fill = myBrush;
// ...
rectangle_10.Fill = myBrush;
默认情况下,WPF 为 SolidColorBrush 对象的 Changed 事件提供事件处理程序,以便使 Rectangle 对象的 Fill 属性无效。 在这种情况下,每当 SolidColorBrush 不得不引发其 Changed 事件时,必须为每个 Rectangle 调用回叫函数,这些回叫函数调用的累积将导致性能严重下降。 此外,此时添加和删除处理程序将会严重影响性能,这是因为应用程序将不得不遍历整个列表才能执行此操作。 如果应用程序方案从未更改 SolidColorBrush,你将为不必要地维护 Changed 事件处理程序付出代价。
冻结 Freezable 会改进其性能,因为不再需要因维护更改通知而消耗资源。 下表显示简单的 SolidColorBrush 在其 IsFrozen 属性设置为 true
时的大小,并列出该属性未设置为该值时的情况以供对比。 这假设将一个画笔应用于十个 Rectangle 对象的 Fill 属性。
State | 大小 |
---|---|
已冻结的 SolidColorBrush | 212 字节 |
非冻结的 SolidColorBrush | 972 字节 |
以下代码示例演示了此概念:
Brush frozenBrush = new SolidColorBrush(Colors.Blue);
frozenBrush.Freeze();
Brush nonFrozenBrush = new SolidColorBrush(Colors.Blue);for (int i = 0; i < 10; i++)
{// Create a Rectangle using a non-frozed Brush.Rectangle rectangleNonFrozen = new Rectangle();rectangleNonFrozen.Fill = nonFrozenBrush;// Create a Rectangle using a frozed Brush.Rectangle rectangleFrozen = new Rectangle();rectangleFrozen.Fill = frozenBrush;
}
解冻的可冻结对象的已更改处理程序可以使对象保持活动状态
对象传递给 Freezable 对象的 Changed 事件的委托是对该对象的有效引用。 因此,Changed 事件处理程序可以使对象保持活动状态的时间超过预期时间。 当对已注册为侦听 Freezable 对象的 Changed 事件的对象执行清理时,在释放对象前删除委托是非常必要的。
WPF 还会在内部挂钩 Changed 事件。 例如,所有值为 Freezable 的依赖属性将自动侦听 Changed 事件。 采用 Brush 的 Fill 属性说明了此概念。
Brush myBrush = new SolidColorBrush(Colors.Red);
Rectangle myRectangle = new Rectangle();
myRectangle.Fill = myBrush;
将 myBrush
赋值给 myRectangle.Fill
时,指向回 Rectangle 对象的委托将添加到 SolidColorBrush 对象的 Changed 事件。 这意味着以下代码实际上不会使 myRect
可以进行垃圾回收:
myRectangle = null;
在这种情况下,myBrush
仍会使 myRectangle
保持活动状态,并在其引发 Changed 事件时对其进行调用。 请注意,将 myBrush
赋值给新 Rectangle 的 Fill 属性时,仅将另一个事件处理程序添加到 myBrush
。
清理这些类型的对象的建议方式是从 Fill 属性删除 Brush,这将进而删除 Changed 事件处理程序。
myRectangle.Fill = null;
myRectangle = null;
4用户界面虚拟化
WPF 还提供 StackPanel 元素的一个变体,用于自动“虚拟化”数据绑定子级内容。 在此上下文中,“虚拟化”一词指的是以下技术:通过此技术,从较多的数据项中生成一个对象子集,具体取决于屏幕上哪些项可见。 如果在指定时刻只有少量 UI 元素位于屏幕上,则此时生成大量 UI 元素需要占用大量内存和处理器。 VirtualizingStackPanel(通过 VirtualizingPanel 提供的功能)计算可见项,并与来自 ItemsControl(如 ListBox 或 ListView)的 ItemContainerGenerator 配合使用,以便仅为可见项创建元素。
作为性能优化的结果,将仅生成这些项的视觉对象,或如果它们在屏幕上是可见的,则保持活动状态。 这些视觉对象不再位于控件的可视区域时,则可能已被删除。 请勿将此与数据虚拟化发生混淆,数据虚拟化中的数据对象不会全部出现在本地集合中 - 而是根据需要进行流式处理。
下表显示了将 5000 个 TextBlock 元素添加到 StackPanel 和 VirtualizingStackPanel 并使其呈现所需的运行时间。 在此情形中,测量值是指从将文本字符串附加到 ItemsControl 对象的 ItemsSource 属性至面板元素显示此文本字符串之间的时间。
主机面板 | 呈现时间 (ms) |
---|---|
StackPanel | 3210 |
VirtualizingStackPanel | 46 |
相关文章:
【WPF.NET开发】优化性能:对象行为
本文内容 不删除对象的事件处理程序可能会使对象保持活动状态依赖属性和对象Freezable 对象用户界面虚拟化 了解 WPF 对象的内部行为有助于在功能和性能之间做出适当的取舍。 1、不删除对象的事件处理程序可能会使对象保持活动状态 对象传递给其事件的委托是对该对象的有效…...
uniapp中封装一个svg转base64的组件
uniapp中由于不支持svg--》base64,同时无法使用h5中atob,这里我们采用js-base64插件实现这样一个组件,只要传人svg的代码即可在uniapp中转为base64,同时支持自定义参数,比如宽度,高度,等 1 安装 npm inst…...

QT播放gstreamer命令(三)---使用QMediaPlayer
前文: 因为之前听说过,QMediaPlayer已经集成了gstreamer,但是并没有什么接口来例子来说明,根本看不出来有任何gstreamer的形式,于是在QT5助手里面搜了一下,发现确实有gstreamer的痕迹,但是例子写…...
Ubuntu22扩大分区
一台Ubuntu一直以为扩展成功了的,但是用起来空间不够,才发现空间还是那么小,所以赶快想办法扩展。 首先尝试使用gparted软件,结果在软件里面发现硬盘分区/dev/sda3已经全分配78G了。 但是看df -H,明明没有扩展: /dev…...

数据结构篇-05:哈希表解决字母异位词分组
本文对应力扣高频100 ——49、字母异位词分组 哈希表最大的特点就是它可以把搜索元素的时间复杂度降到O(1)。这一题就是要我们找到 “字母异位词” 并把它们放在一起。 “字母异位词”就是同一个单词中字母的不同组合形式。判断“字母异位词”有两个视角:1、所含字…...

添加了gateway之后远程调用失败
前端提示500,后端提示[400 ] during [GET] to [http://userservice/user/1] 原因是这个,因为在请求地址写了两个参数,实际上只传了一个参数 解决方案:加上(required false)并重启所有相关服务...

C#,哥伦布数(Golomb Number)的算法与源代码
1 哥伦布数(Golomb Number) 哥伦布数(Golomb Number)是一个自然数的非减量序列,使得n在序列中正好出现G(n)次。前几个15的G(n)值为:1 2 2 3 3 4 4 4 5 5 5 6…...

JVM学习
1.Java虚拟机内部有哪些线程共享,那些线程隔离 程序计数器: 通过改变这个计数器的值来选取下一条需要执行的字节码命令 Java虚拟机栈: 栈,每个方法被执行时,Java虚拟机都会同步的创建一个栈帧用于存储局部变量表&…...
Visual Studio 20XX中utf-8中文在控制台显示乱码
文章目录 在 Visual Studio 20xx中,如果源码文件是 UTF8编码,要打印中文到控制台时,控制台会显示乱码,可以进行以下设置。 包含<Windows.h>头文件。在main函数初始调用SetConsoleOutputCP(CP_UTF8)设置控制台输出字符集为UT…...

拥抱个人成长与社会进步:自我认知与开放心态的相互影响
拥抱个人成长与社会进步:自我认知与开放心态的相互影响 Embracing Personal Growth and Societal Progress: The Interplay of Self-Awareness and Open-mindedness 一、引言 I. Introduction 在当今急速发展的时代,个人成长与社会进步交织在一起&…...

【PostgreSQL内核学习(二十五) —— (DBMS存储空间管理)】
DBMS存储空间管理 概述块(或页面)PageHeaderData 结构体HeapTupleHeaderData 结构 表空间表空间的作用:表空间和数据库关系表空间执行案例 补充 —— 模式(Schema) 声明:本文的部分内容参考了他人的文章。在…...

2024年 复习 HTML5+CSS3+移动web 笔记 之CSS遍 第5天
第 五 天 整个网站例 5.1 准备工作 项目目录与版心 base.css 5.2 网页制作思路 5.3 header 区域-整体布局 5.4 header区域-logo 5.5 header区域-导航 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&l…...
SpringBoot使用Kafka详解含完整代码
1. 前言 随着大数据和实时处理需求的增长,Kafka作为一种分布式流处理平台,与Spring Boot的集成变得尤为重要。本文将详细探讨如何在Spring Boot应用程序中设置和使用Kafka,从基础概念到高级特性,通过实际代码示例帮助读者深入理解…...
解决:java -jar 在cmd中运行 程序卡顿,卡死的 问题。BIO和NIO案例保存
解决 怎么解决,就是 日志别输出到 cmd 就行了。就行了。就行了。 java -jar demo.jar > output.log 2>&1 &最近写东西,遇到了 程序偶尔卡死的情况。是java -jar 启动的。具体卡死为:http请求超级卡顿 或 偶尔反应好多个请求&…...
LeetCode第824题 - 山羊拉丁文
题目 解答 String toGoatLatin(String S) {if (S null) {return "";}S S.trim();if (S.isEmpty()) {return "";}StringBuilder sb new StringBuilder();String[] tokens S.split(" ");for (int i 0, j 1, length tokens.length; i <…...

[Python] 什么是逻辑回归模型?使用scikit-learn中的LogisticRegression来解决乳腺癌数据集上的二分类问题
什么是线性回归和逻辑回归? 线性回归是一种用于解决回归问题的统计模型。它通过建立自变量(或特征)与因变量之间的线性关系来预测连续数值的输出。线性回归的目标是找到一条直线(或超平面),使得预测值与观…...

那些不输于乙游男主人设的国漫男主
最近乙游的势头越来越猛,新宠旧爱一起上阵,叫人应接不暇。在二次元的世界里,乙游男主们凭借着超凡的魅力,成为了无数少女心中的理想对象。他们或冷酷、或温柔、或阳光、或神秘,每一个角色都有着独特的性格和故事。 乙游…...

Apache Doris 整合 FLINK CDC + Iceberg 构建实时湖仓一体的联邦查询
1概况 本文展示如何使用 Flink CDC Iceberg Doris 构建实时湖仓一体的联邦查询分析,Doris 1.1版本提供了Iceberg的支持,本文主要展示Doris和Iceberg怎么使用,大家按照步骤可以一步步完成。完整体验整个搭建操作的过程。 2系统架构 我们整…...

关于华为应用市场上架,申请权限未告知目的被驳回问题的简单处理方式
关于华为应用市场上架过程中出现的【您的应用在运行时,未同步告知权限申请的使用目的,向用户索取(存储、拍照)等权限,不符合华为应用市场审核标准。】 使用方式: 1、引入 import permision from "/m…...
【ElasticSearch】概述
文章目录 ElasticSearch1.基本介绍2.设计理念3.基本架构与核心概念学习参考资料: ElasticSearch 简单整理ES基本概念,设计理念,构建与使用,供回顾。 1.基本介绍 Elasticsearch 是一个基于 Apache Lucene 的开源的分布式搜索引擎…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...